目錄
JNIEnv的原理
我們通過(guò)查看源碼發(fā)現(xiàn)JNIEnv其實(shí)是結(jié)構(gòu)體JNINativeInterface_的一級(jí)指針。
然后我們繼續(xù)查看結(jié)構(gòu)體JNINativeInterface_的源碼發(fā)現(xiàn)其中有好多的函數(shù)指針碳默,也就是我們平時(shí)用來(lái)與Java互調(diào)的那些函數(shù)
模擬JNIEnv的實(shí)現(xiàn)
接下來(lái)我們就通過(guò)簡(jiǎn)單的代碼來(lái)模擬JNIEnv的實(shí)現(xiàn):
#include<stdio.h>
#include<stdlib.h>
typedef const struct JNINativeInterface_* JNIEnv;
typedef char* jstring;//模擬定義jstring
struct JNINativeInterface_
{
char* (* NewStringUTF)
(JNIEnv* env, const char* utf);
};
char* NewStringUTF(JNIEnv* env, const char* utf) {
return utf;
}
//模擬Java的Native方法
jstring Java_JniDemo_getString(JNIEnv* env) {
return (*env)->NewStringUTF(env,"模擬JNIEnv");
}
void main() {
struct JNINativeInterface_ jni_interface;
jni_interface.NewStringUTF = NewStringUTF;
JNIEnv jni_env = &jni_interface;
JNIEnv* env = &jni_env;
jstring j_string = Java_JniDemo_getString(env);
printf("%s\n",j_string);
system("pause");
}
運(yùn)行結(jié)果如下: