Java 使用C++;

Java 使用C++;,java,android,c++,android-ndk,java-native-interface,Java,Android,C++,Android Ndk,Java Native Interface,我做了两个测试项目,都是使用JNI的android应用程序 第一次,我没有使用Android工具/添加本机支持。本机方法是使用JNI的c语法在.c文件中定义的,它工作正常,成功地找到并调用了该方法 在第二个项目中,我添加了本机支持,并且使用JNI的C++语法在.CPP文件中编写了本机代码。在这种情况下,它不起作用,调用它时找不到本机方法 我已经检查了这个方法的名称1000次了,它的拼写非常完美。项目编译正确,也成功加载了.so库,但找不到该方法 这是我的Cpp文件: #include <j

我做了两个测试项目,都是使用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
}
#包括
JNIEXPORT void JNICALL Java\u xxxpackagenamexxx\u xxxclassnamexxx\u NativeShowMsgBox(JNIEnv*env、jobject jobj、jstring oStr)
{
//一些东西
}
这是什么原因?为什么在使用C++时它使用时工作不正常?我会错过什么? 谢谢。

< P>内部,C++编译器的“Mangle”的名字是C++函数(例如,用于打字的目的),并且需要告诉一个给定的函数应该被称为C函数(因此,没有它的名字被损坏)。
extern "C" {
    JNIEXPORT void JNICALL Java_xxxpackagenamexxx_xxxclassnamexxx_NativeShowMsgBox(...)
    {
        // some stuff
    }
}
<>关于在共享库中使用CPP的更多信息,请参阅内部的C++编译器的“Mangle”的C++函数的名称(例如,用于打字的目的),并且需要告知给定函数应该被称为C函数(因此,没有名称被损坏)。 有关在共享库中使用CPP的更多信息,请参阅。

\include
您还必须包含生成的.h文件。生成函数
extern“C”
,并检查名称是否正确。

\include

您还必须包含生成的.h文件。使函数<代码>外“C”<代码>,同时提供了一个检查,您得到了正确的名称。

< P>我在java类本机函数声明中指定的参数类型与C++声明中声明的类型不匹配时遇到了这个问题。java会生成在H文件中看起来是正确的条目,但是C++编译器总是把入口点名称拼成。这并不是因为我的其他方法的名字写得不好


我的例子是,我在java方法声明中传递了一个长的[],但是在C++方法声明中使用了jObjeTray.x。将C++声明更改为JLangStar解决了问题,函数不再被破坏。

< P>我在java类本机函数声明中指定的参数类型与C++中声明的类型不匹配时遇到了这个问题。java会生成在H文件中看起来是正确的条目,但是C++编译器总是把入口点名称拼成。这并不是因为我的其他方法的名字写得不好


我的例子是,我在java方法声明中传递了一个长的[],但是在C++方法声明中使用了jObjeTray.x。更改C++声明到JLangSnar解决了问题,函数不再被修改。我必须在.cpp文件中将函数转发声明为extern C。使用

javah
生成所需的头文件。那么,你的签名就不会有问题了。我想我找到问题了。我必须在.cpp文件中将函数转发声明为extern C。使用
javah
生成所需的头文件。这样,您就不会有签名问题。由于您添加了
extern“C”
或包含了生成的.h文件,因此该函数不再被损坏。它与更改参数tyres无关,该参数必须与生成的
javah
一致。由于您添加了
extern“C”
或包含了生成的.h文件,因此该函数不再损坏。它与更改参数轮胎无关,该参数必须与生成的
javah
一致。
#include <jni.h>