gpt4 book ai didi

multithreading - 在 Android NDK 中跨线程共享 JavaVM*

转载 作者:行者123 更新时间:2023-12-04 06:37:25 24 4
gpt4 key购买 nike

我想从接收来自另一个可执行文件的回调的 cpp 文件中调用 Java 类方法。

为了实现这一点,我使用 检索了一个 JavaVM 指针。 android::AndroidRuntime::getJavaVM() .cpp 文件中直接接收 JNI 方法调用的方法。我通过构造函数将这个 JavaVM 指针共享到最终的 .cpp 文件中,我在其中调用所需的 Java 方法,如下所示:

/* All the required objects(JNIEnv*,jclass,jmethodID,etc) are appropriately declared. */
**JNIEnv* env;
jvm->AttachCurrentThread(&env, NULL);
clazz = env->FindClass("com/skype/ref/NativeCodeCaller");
readFromAudioRecord = env->GetStaticMethodID(clazz, "readFromAudioRecord", "([B)I");
writeToAudioTrack = env->GetStaticMethodID(clazz, "writeToAudioTrack", "([B)I");**

但是,我得到了一个 SIGSEGV 运行此代码时出错。

根据 JNI 文档,这似乎是在任意上下文中获取 JNIEnv 的合适方法: http://java.sun.com/docs/books/jni/html/other.html#26206

在这方面的任何帮助将不胜感激。

问候,
尼拉吉

最佳答案

如果您尝试使用 JNIEnv 或 JavaVM 引用而不将线程附加到 VM,则全局引用将不会阻止新线程中的段错误。你第一次做的很好,Mārtiņš Možeiko 错误地暗示你做的事情有问题。

不要删除它,只需学习如何使用它。那家伙不知道他在说什么,如果它在 jni.h 中,你可以很确定它不会去任何地方。它没有被记录的原因可能是因为它是荒谬的自我解释。您不需要创建 GlobalReference 对象或任何东西,只需执行以下操作:

#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <android/log.h>
#include <linux/threads.h>
#include <pthread.h>

#define LOG_TAG "[NDK]"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

static pthread_mutex_t thread_mutex;
static pthread_t thread;
static JNIEnv* jniENV;

void *threadLoop()
{
int exiting;
JavaVM* jvm;
int gotVM = (*jniENV)->GetJavaVM(jniENV,&jvm);
LOGI("Got JVM: %s", (gotVM ? "false" : "true") );
jclass javaClass;
jmethodID javaMethodId;
int attached = (*jvm)->AttachCurrentThread(jvm, &jniENV,NULL);
if(attached>0)
{
LOGE("Failed to attach thread to JavaVM");
exiting = 1;
}
else{
javaClass= (*jniENV)->FindClass(jniENV, "com/justinbuser/nativecore/NativeThread");
javaMethodId= (*jniENV)->GetStaticMethodID(jniENV, javaClass, "javaMethodName", "()V");
}
while(!exiting)
{
pthread_mutex_lock(&thread_mutex);
(*jniENV)->CallStaticVoidMethod(jniENV, javaClass, javaMethodId);
pthread_mutex_unlock(&thread_mutex);
}
LOGE("Thread Loop Exiting");
void* retval;
pthread_exit(retval);
return retval;
}

void start_thread(){
if(thread < 1)
{
if(pthread_mutex_init(&thread_mutex, NULL) != 0)
{
LOGE( "Error initing mutex" );
}
if(pthread_create(&thread, NULL, threadLoop, NULL) == 0)
{
LOGI( "Started thread#: %d", thread);
if(pthread_detach(thread)!=0)
{
LOGE( "Error detaching thread" );
}
}
else
{
LOGE( "Error starting thread" );
}
}
}

JNIEXPORT void JNICALL
Java_com_justinbuser_nativecore_NativeMethods_startThread(JNIEnv * env, jobject this){
jniENV = env;
start_thread();
}

关于multithreading - 在 Android NDK 中跨线程共享 JavaVM*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10240791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com