Cuándo usar JNI en el desarrollo de Android
Android JNI es el vínculo entre la parte Java de Android y la parte C/C. El uso completo de JNI requiere código Java y código C/C. El código C/C se utiliza para generar archivos de biblioteca y el código Java se utiliza para hacer referencia a archivos de biblioteca C/C y llamar a métodos C/C.
Código de pieza Java de Android: jnitest.java?
02?
03package?com.hello.jnitest;?
04?
05
06?
07importar?android.app.Activity;?
08?
09importar ?android.os.Bundle;?
10
11
12
13público?*/
16
17@Override
18
19público?{
20
21super.onCreate(savedInstanceState) ;?
22?
23setContentView(R.layout.main);?
24?
25Nadd?test?=? new?Nadd();?
26
27setTitle("¿El? Nativo? ¿Agregar? ¿Resultado? es?" String.valueOf(test.nadd(10,?20)) );?
28?
29}?
30?
31}?
32?
33Nadd.java?
34?
35package?com.hello.jnitest;?
36?
37
38?
39¿clase pública?Nadd?{?
40?
41¿estática?{? >
42?
43System.loadLibrary("hello_jni");?
44?
44?
45} ?
46
47
48
49¿público?
50
51 }
Descripción del código Java:
1) jnitest.java es un objeto de clase activo, que genera un objeto de clase que llama a la función JNI y también llama al método JNI. el método JNI El resultado se muestra en la barra de título
2) Nadd.java es la referencia y declaración de la biblioteca JNI y las funciones de la clase, entre las que se refiere la función System.loadLibrary(); la biblioteca JNI;
2) Declare una función que llame a la biblioteca JNI y agregue la palabra clave local al frente;
Código de pieza de Android C/C: 01#define?LOG_TAG?" hola-JNI"?
02#include?lt;stdio.hgt;?
03#include?lt;stdlib.hgt;?
04# include?lt;unistd.hgt;?
05#include?lt;sys/types.hgt;?
06#include?lt;sys/stat.hgt;?
07#include? lt;fcntl.hgt;?
08#include?lt;assert.hgt;?
09#inc
¿lude?"jni.h"?
10#include?"JNIHelp.h"?
11#include?"android_runtime/AndroidRuntime.h"?
12static?jint?com_hello_jnitest_jnitest_nadd(JNIEnv?*env, ?jobject?obj, ?jint?a, ?jint?b)?
13{?
14return?(a? *?b);?
15}?
16estático?{?
17{"nadd",?" (II)I",? void?*)com_hello_jnitest_jnitest_nadd},?
18};?
19estático?
20{?
21retorno?
22}?
23jint?JNI_OnLoad(JavaVM?*vm, ?void?*reserved)?
24{?
25JNIEnv?
26if(vm-gt;GetEnv((void?**)amp;env,?JNI_VERSION_1_4)!=?JNI_OK)?{
27printf("Error?GetEnv\n" );?
28return?-1;?
29}?
30assert(env! =?NULL);?
31if(register_android_test_hello(env)?{
32printf("register_android_test_hello?error.\n");?
33return?
34}?
35return?JNI_VERSION_1_4;?
36}
Descripción del código JNI C/C:
1) Función JNI_OnLoad(). Esta función se llama y ejecuta cuando el programa Java llama a System.loadLibrary() y se usa para registrar funciones JNI con JavaVM, etc. En este ejemplo, el hilo de la aplicación actual, es decir, JNIEnv, se obtiene primero a través del parámetro JavaVM (puntero de máquina virtual Java): y luego se registra la implementación local del puntero de función llamando a android::AndroidRuntime::registerNativeMethods () .
2) Relación de mapeo entre funciones JNI y funciones de llamada Java.
Utilice JNINativeMethod para asociar el nombre de la función llamada por Java con el nombre de la función implementada por JNI;
3) Implementación de la función JNI;
Código Android.mk: 1LOCAL_PATH?:=?$( llamar a ?my-dir)?
2include?$(CLEAR_VARS)?
3LOCAL_PRELINK_MODULE?:=?false
4LOCAL_SRC_FILES?:=?\? p >
5com_hello_jnitest.cpp?
6LOCAL_SHARED_LIBRARIES?\?
7libandroid_runtime
8LOCAL_MODULE?:=?libhello_jni? 9include ?$(BUILD_SHARED_LIBRARY)
A lo que debe prestar atención es a:
1) La parte JNI C/C del código JNI C/C debe compilarse en el árbol de código fuente de Android y se completa la compilación. Finalmente, mi enfoque es cargar directamente el .so generado en /system/libandroid_runtime.
2) El código Java se puede compilar directamente en eclipse y ejecutar en la máquina virtual.
Compile la parte JNI C/C del código (en el directorio raíz de Android; código fuente del kernel):
#make libhello_jni
Después de eso, genere libhello_jni en el directorio out/target. so se encuentra en el directorio out/target/product/generic/system/lib/
Sube libhello_jni.so a la máquina virtual de Android:
#adb push out/target/product /generic /system/lib/libhello_jni.so /system/lib
NOTA: Puede ocurrir un error de falta de memoria en este momento. Cuando esto sucede, debes recargar usando #adb remount.
Además, también puede utilizar eclipse para iniciar directamente la máquina virtual de Android. Si se produce el error anterior y se utiliza #adb remount, debe iniciar manualmente la máquina virtual de Android, por ejemplo: #emulator. -avd xxx #emulador-avd-xxx :