Android NDK开发:JNIEnv的原理

目录

JNIEnv的原理

我们通过查看源码发现JNIEnv其实是结构体JNINativeInterface_的一级指针。



然后我们继续查看结构体JNINativeInterface_的源码发现其中有好多的函数指针,也就是我们平时用来与Java互调的那些函数


模拟JNIEnv的实现

接下来我们就通过简单的代码来模拟JNIEnv的实现:

#include
#include

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");
}

运行结果如下:


你可能感兴趣的:(Android NDK开发:JNIEnv的原理)