JNI AttachNativeThread在Linux上始终失败,返回值为-1
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JNI AttachNativeThread在Linux上始终失败,返回值为-1相关的知识,希望对你有一定的参考价值。
我正在编写一个围绕本机C ++库的JNI包装器,但是我在将本机线程附加到Linux上的JVM时遇到了麻烦。在Windows上一切正常,但是当我在Ubuntu机器上调用AttachNativeThread()时,它总是返回-1。
这是我获取JNIEnv指针的方式:
JNIEnv* Utils::getJNI() {
JNIEnv* jni;
int getEnvResult = FMODWrapper::jvm->GetEnv((void**) &jni, JNI_VERSION_1_8);
if (getEnvResult == JNI_EDETACHED) {
JavaVMAttachArgs attachArgs;
attachArgs.version = JNI_VERSION_1_8;
attachArgs.group = nullptr;
std::stringstream newName;
newName << "jni-attached-daemon-" << std::this_thread::get_id();
attachArgs.name = (char*) newName.str().c_str();
int attachResult = FMODWrapper::jvm->AttachCurrentThreadAsDaemon(android_VOIDPP_CAST &jni, &attachArgs);
if(attachResult != 0) {
std::cerr << "Failed to attach thread! " << attachResult << "(" << newName.str() << ")" << std::endl;
}
}
return jni;
}
我知道JVM指针不是null,而且代码在Windows上完美运行。如果由于某种原因无法在Linux上附加本机线程,我总是愿意接受替代方案:我想要实现的东西基本上是回调到我的Java代码中。事件发生在C ++中,例如File for open请求,我需要能够在Java中处理它。
更新:我的JVM版本,包括java
和javac
,这是我用来编译和运行程序的。
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.18.10.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
javac 1.8.0_191
可能你的Linux上的JVM不兼容Java 8。除非您使用某些Java 8 JNI功能,否则没有理由要求JNI_VERSION_1_8。通常,JNI_VERSION_1_6就足够了。
见JNI Linux segmentation fault。从Windows切换到Linux时,相同的FMODWrapper也存在同样的问题。
根本原因可能是包装器中使用的记录器。正如Lóránt Viktor Gerber在那里所示,记录器初始化为对java / lang / System的本地引用。如果这个记录器以某种方式参与Utils::getJNI()
,它将失败。
您的代码的另一个可疑部分是将临时名称传递给AttachCurrentThreadAsDaemon()
。我会尝试将其设置为nullptr以排除任何干扰。
如果以上所有方法都不起作用,请检查Linux环境中AttachCurrentThreadAsDaemon()
(不是守护程序)是否仍然失败。
以上是关于JNI AttachNativeThread在Linux上始终失败,返回值为-1的主要内容,如果未能解决你的问题,请参考以下文章
Android中关于JNI 的学习在JNI层訪问Java端对象