ndk_002RegisterNatives
2017-01-13 本文已影响38人
冉桓彬
http://blog.csdn.net/conowen/article/details/7524744
http://blog.csdn.net/sno_guo/article/details/7688227
http://wenku.baidu.com/link?url=NkHvx8fx17eKWEJNWViXB6SmZmkNXCa9rCTiN-uYj9mLV0sNNJ2P5ZgqNftYCshxaZtSO6YnkHAdsbqVYwmvQR-h5Mh3M0EnHjuyV8qsJj7
当Android的VM执行到程序里的System.loadLibrary("***.so");时, 首先会执行xx.so中的JNI_OnLoad()函数.
1. RegisterNatives相关概念:
- demo:
完整代码已经传至github:
https://github.com/ranhuanbin/JniProject/blob/master/app/src/main/jni/jnitest.c
下面是伪代码
#define JNI_CLASS_JNITEST "rhb/jni/JniTest"
#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
static void jniTest(JNIEnv *env,jclass clazz){
LOGI("[%s]",__FUNCTION__);}
static JNINativeMethod g_methods[] = {
{"javaTest","()V",(void*)jniTest}
};
JNIEXPORT jint JNI_OnLoad(JavaVM *vm,void *reserved) {
LOGI("[%s]",__FUNCTION__);
JNIEnv* env = NULL;
(*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4);
jclass clazz = (*env)->FindClass(env,JNI_CLASS_JNITEST);
(*env)->RegisterNatives(env, clazz, g_methods, NELEM(g_methods));
return JNI_VERSION_1_4;
}
JNIEXPORT void JNI_OnUnload(JavaVM *jvm, void *reserved) {
LOGI("[%s]",__FUNCTION__);
}
(*env)->RegisterNatives:向VM(即AndroidRuntime)登记g_methods表格所含的本地方法.
- RegisterNatives函数原型:
jint RegisterNatives(jclass clazz, const JNINativeMethod* methods, jint nMethods)
clazz: 告诉VM, clazz类中使用了g_methods中的本地方法;
methods: 定义了java语言和本地语言(c/c++)的映射关系, 后面详细介绍.
nMethods: g_methods数组元素个数;
2.g_methods():
static JNINativesMethods g_methods[] = {
{"javaTest","()V",(void*)jniTest};
};
javaTest: 这个是java中clazz的方法;
jniTest: 这个是本地方法;
()V: 这个表示java函数原型.
3.(**)V:
本地方法中数据类型有基本数据类型和引用数据类型; 注意这里是映射关系, 与之前的java与本地数据类型的区别;
- ()里面的数据表示java方法中的形参类型, java方法的返回类型;
例如
(i,i)V则表示java方法原型是public void method(int a, int b);
- 第二个参数详解:
基本数据类型:
Field Descriptor Java Language Type
Z -> boolean
B -> byte
C -> char
S -> short
I -> int
J -> long
F -> float
D -> double
引用数据类型:
Field Descriptor Java Language Type
Ljava/lang/String -> String
[I -> int[]
[Ljava/lang/Object -> Object[]
Example:
"()Ljava/lang/String;" -> String function();
"(ILjava/lang/Class;)J" -> long function(int a, Class clazz);
"([B)V" -> void function(byte[] bys);