Android NDK开发:JNIEnv的原理
2021-01-27 本文已影响0人
itfitness
目录
JNIEnv的原理
我们通过查看源码发现JNIEnv其实是结构体JNINativeInterface_的一级指针。
然后我们继续查看结构体JNINativeInterface_的源码发现其中有好多的函数指针,也就是我们平时用来与Java互调的那些函数
模拟JNIEnv的实现
接下来我们就通过简单的代码来模拟JNIEnv的实现:
#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");
}
运行结果如下: