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版本,包括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就足够了。

另一答案

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端对象

Android中关于JNI 的学习在JNI层訪问Java端对象

JNI开发流程-JNI/NDK

Jni OnLoad()和OnUnload()

Android JNI 学习:JNI 简介

Android jni/ndk编程五:jni异常处理