gpt4 book ai didi

java - AttachCurrentThread 崩溃

转载 作者:太空狗 更新时间:2023-10-29 13:25:34 25 4
gpt4 key购买 nike

如果调用以下函数,应用程序会崩溃:

void on_log(JavaVM* vm, int level, const char *data)
{
printOnAndroid(level, data);
pthread_t loggerThread;
pthread_create(&loggerThread, NULL, attachThreadToJavaVMAndPrint, data);
pthread_join(loggerThread, NULL);
}

void attachThreadToJavaVMAndPrint(JavaVM* vm, const char *data)
{
int isThreadAttached = attachJNIEnvToThread(vm);
if (isThreadAttached == 1)
{
JNIEnv* env;
(*vm)->GetEnv(vm, &env, APP_JNI_VERSION);

jclass thisClass = (*env)->GetObjectClass(env, _loggerObject);
jmethodID methodId = (*env)->GetMethodID(env, thisClass, "logFromC","(Ljava/lang/String;)V");
if (methodId != NULL)
{
jstring message = (*env)->NewStringUTF(env, data);
(*env)->CallVoidMethod(env, _loggerObject, methodId, message);
}
(*vm)->DetachCurrentThread(vm);
}
}

void printOnAndroid(int level, const char* data)
{
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "XXXX %i, data %s", level, data);
}

int attachJNIEnvToThread(JavaVM* vm)
{
JNIEnv* env;
JavaVMAttachArgs args;
args.version = APP_JNI_VERSION;
args.name = NULL;
args.group = NULL;
if ((*vm)->GetEnv(vm, &env, APP_JNI_VERSION) == JNI_EDETACHED)
{
jint attachResponse = (*vm)->AttachCurrentThread(vm, &env, &args);
if ((*vm)->GetEnv(vm, &env, APP_JNI_VERSION) != JNI_OK)
{
return 0;
}
}
return 1;
}

有一个宏:

  #define APP_JNI_VERSION JNI_VERSION_1_2

根据日志,调用 attachJNIEnvToThread(..) 时发生崩溃

编辑:

它在 linux 上成功运行..所以可能有一些我不知道的 android 特有的东西。

编辑 2:

更改了以下签名:

  void * attachThreadToJavaVMAndPrint(void* dataArg)
{
JavaVM* vm = _vm;
const char* data = (const char *)dataArg;
int isThreadAttached = attachJNIEnvToThread(vm);
if (isThreadAttached == 1)
{
JNIEnv* env;
(*vm)->GetEnv(vm, &env, APP_JNI_VERSION);

jclass thisClass = (*env)->GetObjectClass(env, _loggerObject);
jmethodID methodId = (*env)->GetMethodID(env, thisClass, "logFromC","(Ljava/lang/String;)V");
if (methodId != NULL)
{
jstring message = (*env)->NewStringUTF(env, data);
(*env)->CallVoidMethod(env, _loggerObject, methodId, message);
}
(*vm)->DetachCurrentThread(vm);
}
return 0;
}

这稍微改变了日志,崩溃发生在 attachThreadToJavaAndPrint(..)

编辑 3:

这已经解决了。最终更改包括编辑 2 + java 代码中的一些更改(此处不可见(其中有错误))。

最佳答案

首先,确保void on_log(JavaVM* vm, int level, const char *data)中的参数vm是正确的。我将 vm 保存为 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) 中的全局变量,我的代码可以运行:

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
g_vm = vm;
}

在线程函数中

{
ret = g_vm->AttachCurrentThread( (JNIEnv **) &env, NULL);
}

关于java - AttachCurrentThread 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21599303/

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