Android JNI调用的二种方式
首先创建一个专门用于JNI调用的单例MainNative,并且在里面添加静态块加载so库。
publicclass MainNative {
private static MainNative instance =new MainNative();
private MainNative (){}
public static MainNative getInstance(){
returninstance;
}
static {
//加载libMyApp.so库
System.loadLibrary("MyApp");
}
}
-
固定函数名映射方式
首先在java代码中添加方法
public native void Test();
然后在对应的cpp文件中创建方法
注意定义的方法名格式必须为 Java_ +包名 + 类名+方法名
如: Java_ + com_MyApp_myapp_+ ainNative_ + Test
Java_com_MyApp_myapp_MainNative_Test
因为避免C++的函数名替换导致接口名变化必须将方法名定义为c函数
extern "C"
{
voidJava_com_MyApp_myapp_MainNative_Test(JNIEnv *env,jobject obj)
{
LOGI("TestLogi");
}
}
这样就可以直接通过调用MainNative类的native方法Test调用C++的方法Java_com_MyApp_myapp_MainNative_Test了。
-
注册函数映射表方式
在cpp中添加jni.h;
typedef struct {
const char* name; //java中的方法名的字符串
const char* signature; //描述函数的参数和返回值的字符串
void* fnPtr; //C/C++的函数指针
} JNINativeMethod
此结构体就是java和C++函数的映射结构。
先定义一个JNINativeMethod的结构体数组,里面包含JAVA和C/c++的函数映射。
然后在cpp添加JNI_OnLoad函数,JNI_OnLoad在.so被加载的时候就会被调用。
jintJNI_OnLoad(JavaVM* vm, void* reserved);
注册映射调用env->RegisterNatives函数
jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,
jint nMethods)
第一个参数是要注册的类,由findclass获取出来
jclass FindClass(const char* name);//name为完整的类路径
如:"com/MyApp/myapp/MainNative"
第二个参数就是上面说的函数映射结构体。
第三个参数是这个结构体的数目。
通过这个函数调用成功就可以达到双方函数的额映射了。