2011-04-14 23 views
44

Hola, ¿alguien puede sugerirme algunos buenos recursos para aprender JNI para Android y algunos buenos tutoriales de JNI?Jni Tutorial para Android

+12

Me parece que esto es una pregunta perfectamente válida como se ve por los 14k puntos de vista. En casos como este, las opiniones son lo que uno quiere leer. Los ingenieros son obstinados sobre su enfoque de los procesos. En cuanto a atraer spam, stackoverflow obviamente puede manejar ese pequeño problema. La respuesta a continuación es útil y este sitio trata sobre respuestas más útiles. –

+1

Hay un codelab de google. https://codelabs.developers.google.com/codelabs/android-studio-jni/index.html?index=..%2F ..% 2Findex # 0 –

Respuesta

16

Sugeriría descargar el ndk. Descomprímelo y explore los códigos de la carpeta de muestra ndk. Comience con el hello-jni y vaya más allá. Explica mucho con facilidad. También puede navegar por theselinks y this mientras revisa el código y sigue yendo y viniendo.

+0

Puede encontrar un proyecto práctico de JNI usando Android Studio desde mi página de github: https://github.com/russell-shizhen/JniExample. Traté de dar ejemplos sobre el uso de las API de JNI tanto como sea posible. – Russell

41

Tutorial para ECLIPSE

Aquí es first y second pequeños tutoriales, pero si quieres escribir un programa simple que utiliza JNI, puede seguir leyendo :)

Crear proyecto de aplicación de Android, una vez su proyecto ha sido creado, necesitará crear una nueva carpeta dentro del nivel superior del proyecto. Para hacer esto, haga clic derecho en el nombre de su proyecto → Nuevo → Carpeta. Nombre esta carpeta jni. Que agregar clase con el nombre SquaredWrapper. agregue estos código en él

package org.edwards_research.demo.jni; 

public class SquaredWrapper { 
    // Declare native method (and make it public to expose it directly) 
    public static native int squared(int base); 

    // Provide additional functionality, that "extends" the native method 
    public static int to4(int base) 
    { 
     int sq = squared(base); 
     return squared(sq); 
    } 

    // Load library 
    static { 
     System.loadLibrary("square"); 
    } 
} 

Terminal abierto. Debe compilar estos códigos para obtener el archivo de encabezado. Primero llama a este comando.

cd srC# change into the source directory 
javac -d /tmp/ org/edwards_research/demo/jni/SquaredWrapper.java 

Que

cd /tmp 
javah -jni org.edwards_research.demo.jni.SquaredWrapper 

por lo que tendrá el archivo de encabezado denominado en su directorio tmp.

debe ser algo como esto cambio

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class org_edwards_research_demo_jni_SquaredWrapper */ 

#ifndef _Included_org_edwards_research_demo_jni_SquaredWrapper 
#define _Included_org_edwards_research_demo_jni_SquaredWrapper 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  org_edwards_research_demo_jni_SquaredWrapper 
* Method: squared 
* Signature: (I)I 
*/ 
JNIEXPORT jint JNICALL Java_org_edwards_1research_demo_jni_SquaredWrapper_squared 
    (JNIEnv *, jclass, jint); 

#ifdef __cplusplus 
} 
#endif 
#endif 

estos nombres por algún corto para su comodidad, por ejemplo square.h. Copie este archivo de encabezado en la carpeta jni de su aplicación. Luego de crear el archivo square.c en la misma carpeta, copia esto en él.

#include "square.h" 

JNIEXPORT jint JNICALL Java_com_example_android_1jni_1second_1demo_SquaredWrapper_squared 
     (JNIEnv * je, jclass jc, jint base) 
    { 
      return (base*base); 
    } 

Añadir esto en su MainActivity.java

int x = SquaredWrapper.to4(2); 
     x = x*2; 

Añadir Android.mk archivo en la carpeta jni con este cuerpo

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := squared 
LOCAL_SRC_FILES := square.c 

include $(BUILD_SHARED_LIBRARY) 

Se debe crear la biblioteca de la cabecera y los archivos cpp.

Así que sólo tienen que hacer algunas configuraciones mirando en mi first enlace Ahora se puede compilar, asegúrese de que su biblioteca ha creado y su directorio lib consistir en ella.

Tutorial para Android Studio

vamos a considerar que tiene sencilla aplicación para Android abierta por Android Studio

paso 1: abrir su aplicación por Android Studio

paso 2: Descargar NDK y establece la ruta a NDK en las propiedades locales de tu aplicación (debajo/arriba de la ruta sdk de Android) como esta ndk.dir=C\:\\Android\\android-ndk-r10e

P.S. para las ventanas de doble //, para Linux uno/

Paso 3: Añadir carpeta JNI en la aplicación (clic derecho en la aplicación -> Nuevo -> Carpeta -> Carpeta JNI)

paso 4 Conjunto el Gradle de esta manera:

añadir este código en app/build.gradle para iniciar NDK

sourceSets.main { 
     jni.srcDirs = [] 
     jniLibs.srcDir 'src/main/libs' 
    } 

    tasks.withType(NdkCompile) { // disable automatic ndk-build call 
    compileTask -> compileTask.enabled = false 
    } 

    task ndkBuild(type: Exec) { // call ndk-build(.cmd) script 
     if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
      commandLine 'cmd', '/c', 'ndk-build.cmd', '-C', file('src/main').absolutePath 
     } else { 
      commandLine 'ndk-build', '-C', file('src/main').absolutePath 
     } 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 

paso 4:

Crear archivos Android.mk y Application.mk en carpeta JNI de la aplicación con este organismos:

Android.mk

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := main 
LOCAL_SRC_FILES := main.cpp 

include $(BUILD_SHARED_LIBRARY) 

Application.mk

APP_ABI := all 
include $(BUILD_SHARED_LIBRARY) 

En APP_ABI elige qué compiladores usar. Se

paso 5:

Tenemos que ejecutar manualmente NDK ya que desactivarlo desde build.config. Para la creación de archivo en com_example_nativedemo_app_MainActivit.h src \ carpeta principal \ jn tenemos que ejecutar este comando en el terminal

javah -d .\jni -classpath C:\Intel\INDE\IDEintegration\android-sdk-windows\platforms\android-21\android.jar;..\..\build\intermediates\classes\debug com.example.mydemo.nativedemo.MainActivity 

para las ventanas cmd que tiene que dar la ruta completa de los archivos. Para

paso 6:

Agregar archivo en la carpeta main.cpp JNI con este cuerpo:

#include <string.h> 
#include <jni.h> 
#include <vchat_cpptest_Hellojnicpp.h> 

extern "C" { 
     JNIEXPORT jstring JNICALL 
     Java_vchat_cpptest_Hellojnicpp_stringFromJNI 
     (JNIEnv *env, jobject obj) 
     { 
      #ifdef __INTEL_COMPILER_UPDATE 
       return env->NewStringUTF("Hello from Intel C++ over JNI!"); 
      #else 
       return env->NewStringUTF("Hello from default C++ over JNI!"); 
      #endif 
}