- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果调用以下函数,应用程序会崩溃:
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/
如果调用以下函数,应用程序会崩溃: void on_log(JavaVM* vm, int level, const char *data) { printOnAndroid(level, dat
我已经为库创建了一个带有 swig 的 JNI 包装器。我使用 swig Controller 回调 JVM。其中一些回调发生在 native 库中创建的线程上。非 JVM 线程上的第一个回调失败并出
我目前正在将 JNI 功能添加到遗留的 Delphi 应用程序中。在单线程环境中一切正常,但一旦我进入多线程环境,事情就开始变得毛茸茸了。 我的问题是调用 JavaVM^.AttachCurrentT
我在这里找到了 https://stackoverflow.com/a/12901159/6655884一个函数调用,它使用 AttachCurrentThread 附加线程,执行调用,然后使用 De
希望你一切顺利。 我在 C 中有一个 JNI 实现,其中一个 C 函数附加到当前 JVM 线程并回调一个 Java 方法,这实际上在调用 attachCurrentThread() 函数时使 JVM
我一直在阅读有关 JNI 的内容,但似乎无法弄清楚如果线程启动 -> 调用 AttachCurrentThread() -> 进行一些 JNI 调用 -> 线程退出会发生什么。 理想情况下,我们应该在
我正在使用 C 中的 NativeActivity。我的目标是获取对 JNIEnv 的引用,以便我可以进行进一步的 Android 调用。 根据我在 Android 文档和 Stackoverflow
我想知道从 JNI 函数 AttachCurrentThread() 获得的 JNIEnv * 的生命周期。考虑以下检索 JNIEnv 指针的函数。 JNIEnv * RetrieveJniEnvPt
我在基于 django 的站点中使用 pylucene,我想知道是否有人知道启动 jvm 和附加线程的最佳位置。我不想每次有人加载页面时都必须启动一个新的 jvm,但是当我在搜索时附加线程时,我偶尔会
我是一名优秀的程序员,十分优秀!