我正在围绕 native C++ 库编写 JNI 包装器,但我无法将 native 线程附加到 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 指针不为空,而且代码在 Windows 上也能完美运行。如果由于某种原因无法在 Linux 上附加 native 线程,我总是对替代方案持开放态度:我试图实现的基本上是回调到我的 Java 代码中。在 C++ 中发生一个事件,例如打开文件的请求,我需要能够在 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 就足够了。
关于java - JNI AttachNativeThread 在 Linux 上总是失败并返回 -1 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55785464/