C语言调用jni中JNIEnv指针使用和理解

在C语言调用JNI时,与Java环境和虚拟机的交互涉及JNIEnv指针。AttachCurrentThread函数返回的JNIEnv*可能是独立内存或连续内存一部分,其具体性质由库函数实现者掌控。虽然可以解引用后直接使用,但这样做可能丢失了对特定内存区域的访问权限。因此,必须传递AttachCurrentThread返回的地址给后续的JNIEnv函数,如FindClass,因为这些函数需要原始地址来访问关联内存数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用C语言调用jni的时候,需要和java的环境对象和虚拟机对象交互。它们的C语言定义如下。

typedef const struct JNINativeInterface* JNIEnv;
typedef const struct JNIInvokeInterface* JavaVM;

可以看到,JNIEnv和JavaVM是一个指针类型。其结构体包含了很多我们需要用的函数指针:

    jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
    jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
    jboolean    (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);

由于C语言中没有this指针,所以这里所有的函数第一个参数,都是相当于this对象传入调用者。那么,一般我们通过如下函数,获得JNIEnv变量,然后使用。

JNIEnv* envPtr = NULL;

(*nativeActivity->vm)->AttachCurrentThread(nativeActivity->vm, &envPtr, NULL);

(*envPtr)->FindClass(envPtr, "android/app/NativeActivity");

AttachCurrentThread函数,需要一个JNIEnv**二级指针变量,然后把JNIEnv*返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值