java - JNI AttachNativeThread 在 Linux 上总是失败并返回 -1 值

标签 java c++ java-native-interface jnienv

我正在围绕 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 版本,包括 javajavac,这是我用来编译和运行程序的版本。

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/

相关文章:

java - 设置这个引用线程安全吗?

java - ReSTLet 路由不适用于路由中的目录?

c++ - 使用 boost::ptr_vector 的引用或指针符号

c++ - FFmpeg:实时缓冲区 [] [输入] 太满或接近太满(大小的 101%:3041280 [rtbufsize 参数])丢帧

java - 在 Android 上设计一个频繁 JNI 调用的应用程序

java - Spring Web 服务客户端使用智能卡签名

c++ - Emacs、Cedet 和语义

C++ NDK 库针对 jobjectarray 返回方法的内存管理

java - JNI 从 DWord 返回值

JavaEE : Why do we need to know about Concurrency?