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

Native method not found when using C++

本文关键字:本机 方法 找不到 C++ 使用      更新时间:2023-10-16

我做了两个测试项目,都是使用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++时不起作用,而在使用C时起作用?我在这里能缺少什么?非常感谢。

extern "C" {
    JNIEXPORT void JNICALL Java_xxxpackagenamexxx_xxxclassnamexxx_NativeShowMsgBox(...)
    {
        // some stuff
    }
}
#include <jni.h>

您还必须#包含生成的.h文件。生成函数extern "C",并提供一个检查名称是否正确的检查。

在内部,C++编译器"调整"C++函数的名称(例如,出于键入目的),并且需要告诉他们给定的函数应该作为C函数调用(因此,不会更改其名称)。

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

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

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