JNI:生成需要与 Java 交互的线程的本机方法
JNI: native method that spawns threads that need to interact with Java
我有一个从 Java 进程调用的 C 方法:
extern "C" {
JNIEXPORT jstring JNICALL Java_bla_bla_bla(JNIEnv *env, jclass java_class, jint param) {
/* Spawn C threads that are going to call Java methods */
}
}
问题是我的本机方法从 Java 获得的所有内容都是一个 JNIEnv
实例。为了调用 AttachCurrentThread()
,我需要一个 JavaVM
对象。
如何从我的本机方法中获取 JavaVM
指针?
另一种方法是缓存您在 JNI_OnLoad
中收到的 JavaVM*
。
另一种方法是调用 GetJavaVM
函数,它是 JNIEnv
:
的一部分
JNIEXPORT jstring JNICALL Java_bla_bla_bla(JNIEnv *env, jclass java_class, jint param) {
JavaVM *jvm;
if (env->GetJavaVM(&jvm)) {
// Something went wrong
}
// Pass jvm to the new thread
我有一个从 Java 进程调用的 C 方法:
extern "C" {
JNIEXPORT jstring JNICALL Java_bla_bla_bla(JNIEnv *env, jclass java_class, jint param) {
/* Spawn C threads that are going to call Java methods */
}
}
问题是我的本机方法从 Java 获得的所有内容都是一个 JNIEnv
实例。为了调用 AttachCurrentThread()
,我需要一个 JavaVM
对象。
如何从我的本机方法中获取 JavaVM
指针?
另一种方法是缓存您在 JNI_OnLoad
中收到的 JavaVM*
。
另一种方法是调用 GetJavaVM
函数,它是 JNIEnv
:
JNIEXPORT jstring JNICALL Java_bla_bla_bla(JNIEnv *env, jclass java_class, jint param) {
JavaVM *jvm;
if (env->GetJavaVM(&jvm)) {
// Something went wrong
}
// Pass jvm to the new thread