Android Comment appeler des fonctions dans une bibliothèque native via l'interface JNI


Exemple

L’ interface Java native (JNI) vous permet d’appeler des fonctions natives à partir du code Java et inversement. Cet exemple montre comment charger et appeler une fonction native via JNI, il n'entre pas dans l'accès aux méthodes et champs Java à partir du code natif à l'aide des fonctions JNI .

Supposons que vous ayez une bibliothèque native nommée libjniexample.so dans le dossier project/libs/<architecture> et que vous souhaitiez appeler une fonction de la classe Java JNITest dans le package com.example.jniexample .

Dans la classe JNITest, déclarez la fonction comme ceci:

public native int testJNIfunction(int a, int b);

Dans votre code natif, définissez la fonction comme ceci:

#include <jni.h>

JNIEXPORT jint JNICALL Java_com_example_jniexample_JNITest_testJNIfunction(JNIEnv *pEnv, jobject thiz, jint a, jint b)
{
    return a + b;
}

L'argument pEnv est un pointeur sur l'environnement JNI que vous pouvez transmettre aux fonctions JNI pour accéder aux méthodes et aux champs d'objets et de classes Java. Le pointeur thiz est une référence de jobject à l'objet Java sur lequel la méthode native a été appelée (ou la classe s'il s'agit d'une méthode statique).

Dans votre code Java, dans JNITest , chargez la bibliothèque comme JNITest :

static{
    System.loadLibrary("jniexample");
}

Notez la lib au début, et le .so à la fin du nom de fichier est omis.

Appelez la fonction native à partir de Java comme ceci:

JNITest test = new JNITest();
int c = test.testJNIfunction(3, 4);