Red de conocimiento informático - Material del sitio web - Cómo llamar a una biblioteca estática usando JNI en Android Studio

Cómo llamar a una biblioteca estática usando JNI en Android Studio

El desarrollo de Android ndk a menudo encuentra el problema de las bibliotecas dinámicas. Este artículo presenta principalmente:

① Generación de bibliotecas de enlaces dinámicos

② Programación mixta en Java y; C Cómo llamar a una biblioteca de enlaces dinámicos de terceros en caso de Altamente recomendado ② y ④, ③ es demasiado problemático y cada función debe ser llamada una vez por dlsym;

Enlace del código de Baidu Cloud: Contraseña : c5s3

Herramientas/materias primas

Win8.1 x64

adt-bundle-windows-x86_64-20140702

android-ndk -r10d

Generar biblioteca dinámica

1

Hay muchas formas de generar archivos de biblioteca dinámica en Android ndk, pero aquí solo se proporciona un método. Para obtener más métodos de generación, consulte "Biblioteca estática de compilación NDK":

2

El contenido de fkAdd.c es el siguiente:

#include lt;jni. hgt;

int fkAdd(int nX, int nY)

p>

{

return nX nY;

}

3

El contenido de Android.mk es el siguiente:

LOCAL_PATH:= $(call my-dir)

incluye $(CLEAR_VARS )

LOCAL_MODULE:= fkAdd

LOCAL_SRC_FILES:= fkAdd.c

incluye $(BUILD_SHRRED_LIBRARY)

4

1. Abra eclipse

2. Haga clic en el archivo

3, haga clic en Nuevo

4. >5

1. Expanda la opción de Android;

2. Seleccione el proyecto de Android del código existente;

3. 6

1. Ingrese al Director raíz;

2. Cancele las pruebas;

p>

3. Seleccione Copiar proyectos en el espacio de trabajo;

4. Haga clic en Finalizar;

7

1. Haga clic derecho en el proyecto

2. >3. Agregar soporte nativo...;

8

Haga clic en Finalizar

9

Modifique la versión del SDK de Android a 4.0. 3;

Acerca de cómo modificar la versión del SDK de Android:

10

Modificar la versión mínima del SDK: 15

Modificar el SDK de destino versión: 19

Paso de lectura

11

Cree un nuevo archivo fkAdd.c en el directorio jni con el siguiente contenido:

int fkAdd(int nX, int nY)

{

return nX nY;

}

12

Modifique temporalmente el contenido del archivo Android.mk de la siguiente manera:

LOCAL_PATH:= $(llamar a mi -dir)

incluir $(CLEAR_VARS)

#LOCAL_MODULE := hola-jni

#LOCAL_SRC_FILES := hola-jni.c

LOCAL_MODULE:= fkaddso

LOCAL_SRC_FILES:= fkAdd.c

incluye $(BUILD_SHARED_LIBRARY)

13

Utilice el acceso directo Ctrl Después de la compilación de B, puede ver una serie de archivos libfkaddso.so generados en el directorio libs, como se muestra en la siguiente figura

END

Programación Java y C Ajustar para

1

1. Copie libs al directorio jni y elimine los archivos irrelevantes que contiene

2. Elimine el archivo jni/fkadd.c. p>

3. Restaure el archivo Android.mk a su estado original;

2

Modifique algunos códigos en hello-jni.c, de la siguiente manera:

char szMsg[1024] = {0};

int nSum = fkAdd(100, 10);

sprintf (szMsg, "¡Hola desde JNI! Compilado con ABI " ABI ". d ", nSum);

return (*env)-gt; NewStringUTF(env, szMsg);

3

Modificar Android. archivo mk:

LOCAL_PATH:= $(call my-dir)

incluir $(CLEAR_VARS)

LOCAL_MODULE:= fkaddso

LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libfkaddso.so

incluye $(PREBUILT_SHARED_LIBRARY)

incluye $(CLEAR_VARS)

LOCAL_MODULE := hola-jni

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SHARED_LIBRARIES := fkaddso

incluye $(BUILD_SHARED_LIBRARY)

4

Modifique HelloJni.java y agregue una línea:

System.loadLibrary("fkaddso");

5

Ejecutar Ver el efecto del proyecto :

FIN

Usa dlopen para llamar a so

1

Repite el proceso del 1 al 10 en "Generar biblioteca dinámica",

2

Copie el directorio libs que necesita llamar al archivo so al directorio jni y modifique el contenido del archivo Android.mk de la siguiente manera:

LOCAL_PA

TH := $(call my-dir)

incluir $(CLEAR_VARS)

LOCAL_MODULE := fkaddso

LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/ libfkaddso.so

incluye $(PREBUILT_SHARED_LIBRARY)

incluye $(CLEAR_VARS)

LOCAL_MODULE := hola-jni

LOCAL_SRC_FILES := hello-jni.c

incluye $(BUILD_SHARED_LIBRARY)

3

Modifique el contenido de hello-jni.c de la siguiente manera:

char * szSo = "/data/data/com.example.hellojni/lib/libfkaddso.so";

void* fkAddSo = dlopen(szSo, RTLD_LAZY);

int (* fpAdd)(int, int) = (int (*)(int, int))dlsym(fkAddSo, "fkAdd");

char szMsg[1024] = {0}; >

int nSum = fpAdd(100, 200);

dlclose(fkAddSo);

sprintf (szMsg, "s d", szSo, nSum);

return (*env)-gt; NewStringUTF(env, szMsg);

4

En cuanto a cómo obtener la ruta de so en el teléfono móvil, puede ingresar adb shell en la consola Después de eso,

Consulta en el teléfono móvil:

5

El efecto de ejecución después de la compilación:

6

Conveniente También es conveniente para otros. Si cree que es bueno, haga clic en votar a continuación. Esto puede ayudar a otros a encontrar soluciones a los problemas más rápido. . ¡Gracias!

FIN

Desarrollar y llamar en C puro

1

Este método debe agradecerse a los amigos de ndk bar por proporcionar solo soy responsable de ordenarlo y publicarlo después de resumirlo, gracias, dirección original:

#include lt; android_native_app_glue.hgt; (struct android_app* state) {

// Asegúrate de que el pegamento no se haya quitado.

app_dummy();

void* soAdd = dlopen("/ data/data/com.example .native_activity/

lib/libfkAdd.so",RTLD_NOW);

void* soMain = dlopen("/data/data/com.example. actividad_nativa/

lib/libmain.so",RTLD_NOW);

void (*fp_an

droid_main)(struct android_app*) =

(void (*)(struct android_app*))dlsym(soMain, "android_main");

fp_android_main(state);

dlclose(soMain);

dlclose(soAdd);

}

6

En el archivo main.c. Agregue una línea para facilitar las pruebas:

__android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_input 100 200 = [d] ", fkAdd(100, 200));

7

Compile y ejecute, después de hacer clic en la pantalla del teléfono móvil, observe el efecto logcat de la siguiente manera:

END

Notas

La función de c está escrito en la biblioteca de enlaces dinámicos. Al hacerlo, debe tenerse en cuenta que el sistema modificará las funciones de C, por lo que es mejor utilizar el lenguaje C para las pruebas de la biblioteca dinámica