【问题标题】:Native method not found when using C++使用 C++ 时找不到本机方法
【发布时间】:2015-05-02 03:27:19
【问题描述】:

我做了两个测试项目,都是使用 JNI 的 android 应用程序。

对于第一个我没有使用 Android 工具/添加原生支持。本机方法使用 JNI 的 C 语法定义在 .c 文件中,并且工作正常,成功找到并调用方法。

在第二个项目中,我确实添加了本机支持,并使用 JNI 的 C++ 语法将本机代码编写在 .cpp 文件中。这种情况下不行,调用的时候找不到native方法。

我已经检查了方法的名称 1000 次,它的拼写完美。工程编译正常,.so库也加载成功,但是找不到方法。

这是我的 Cpp 文件:

#include <jni.h>

JNIEXPORT void JNICALL Java_xxxpackagenamexxx_xxxclassnamexxx_NativeShowMsgBox( JNIEnv * env, jobject jobj, jstring oStr )
{
    // some stuff
}

这可能是什么原因造成的?为什么在使用 C++ 时它不能在使用 C 时工作?我在这里能错过什么? 谢谢。

【问题讨论】:

  • 我想我找到了问题所在。我不得不在 .cpp 文件中将该函数转发声明为 extern C。
  • 使用javah生成需要的头文件。那么,签名就不会有问题了。

标签: java android c++ android-ndk java-native-interface


【解决方案1】:
extern "C" {
    JNIEXPORT void JNICALL Java_xxxpackagenamexxx_xxxclassnamexxx_NativeShowMsgBox(...)
    {
        // some stuff
    }
}

【讨论】:

    【解决方案2】:
    #include <jni.h>
    

    您还必须#include 生成的 .h 文件。创建函数extern "C" 并检查您的名字是否正确。

    【讨论】:

      【解决方案3】:

      在内部,C++ 编译器''mangle'' C++ 函数的名称(例如,为了打字目的),并且需要告诉他们给定的函数应该作为 C 函数调用(因此,没有它的名字损坏)。

      有关在共享库中使用 CPP 的更多信息,请参阅here

      【讨论】:

        【解决方案4】:

        当我在 Java 类本机函数声明中指定的参数类型与我在 C++ 方法声明中声明的类型不匹配时,我遇到了这个问题。 Javah 会在 .h 文件中生成看似正确的条目,但 c++ 编译器总是会破坏入口点名称。这不是我正确编写的其他方法的名称。

        在我的例子中,我在我的 Java 方法声明中传入了一个 long[],但在我的 c++ 方法声明中使用了一个 jobjectarray。将 c++ 声明更改为 jlong​​array 解决了问题,并且函数不再被破坏。

        【讨论】:

        • 该函数不再被破坏,因为您添加了 extern "C" 或包含了您生成的 .h 文件。它与更改参数 tyres 无关,它必须与 javah 生成的任何内容一致。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        • 1970-01-01
        相关资源
        最近更新 更多