Red de conocimiento informático - Conocimiento informático - Cuándo usar JNI en el desarrollo de Android

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?:=?\?

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 :