1. 接下来我们细讲分析一下前面一讲中,c功能实现的代码:
(1)hello.c :
1 #include <jni.h> 2 3 char* getHello() 4 { 5 //////// 6 return "hello Android From C"; 7 } 8 9 10 //jni协议给java调用 11 // 返回类型 方法名(Java_包名(使用"_"把包名分割)_类名_方法名 (参数) 12 13 //JNIEnv* env jni的结构体数据,jni系统实现 ; obj java对象 调用该jni方法的对象 14 jstring Java_com_himi_helloworld_MainActivity_getHelloFromC(JNIEnv* env, jobject obj) 15 { 16 char* res = getHello();//获取到C代码字符串结果 17 /** 18 * (**env).GetVersion(env); 19 * (*env)->GetVerison(env); 20 */ 21 //jstring (*NewStringUTF)(JNIEnv*, const chat*); 22 jstring jres = (**env).NewStringUTF(env,res); 23 24 return jres; 25 }
• jstring :数据类型就是 void*(指向一个空区域,初始化的指针)
在jni.h文件下:
typedef void* jobject;
typedef jobject jclass;
typedef jobject jstring;
• JNIEnv* env :
JNINativeInterface struct :说明JNINativeInterface是个结构体
typedef const struct JNINativeInterface* JNIEnv; :说明JNIEnv是个结构体指针(这个结构体就是JNINativeInterface)
这个时候JNIEnv* env等价于:
JNINativeInterface** env; :也就是env定义为结构体指针的指针(双重指针)
如果想利用env访问JNINativeInterface结构体的成员NewStringUTF(只不过这里的NewStringUTF是一个函数指针)。
(**env).NewStringUTF(JNIEnv*, const char*);