使用C ++时未找到本机方法

时间:2015-02-24 08:32:53

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

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

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

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

我已经检查了1000次方法的名称,它完全拼写了。项目编译正确,.so库也成功加载,但无法找到该方法。

这是我的Cpp文件:

#include <jni.h>

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

这可能是什么原因造成的?使用C ++时,为什么它不起作用?我在这里可以缺少什么? 谢谢。

4 个答案:

答案 0 :(得分:3)

extern "C" {
    JNIEXPORT void JNICALL Java_xxxpackagenamexxx_xxxclassnamexxx_NativeShowMsgBox(...)
    {
        // some stuff
    }
}

答案 1 :(得分:1)

#include <jni.h>

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

在我的情况下,我在我的Java方法声明中传递了一个long [],但在我的c ++方法声明中使用了jobjectarray。将c ++声明更改为jlong​​array解决了问题,并且函数不再受损。