使用C++时找不到本机方法
Native method not found when using C++
我做了两个测试项目,都是使用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解决了这个问题,并且函数不再被破坏。
相关文章:
- 多次调用本机方法时出现致命错误
- 将本机方法添加到 OpenJDK 源代码
- 如何将类对象传递给 jni 本机方法
- 如何传递InteropServices.ComTypes.IStream到接受IStream*的本机方法,使用c++/c
- 是在DEX文件方法计数中计数的本机C 方法
- 从java调用本机方法时使用Libc SIGSEGV
- 本机方法中的不满意的Linkerror
- Windows Service 无法调用 C++ 本机方法 [DllImpor( "myDLL" )]
- 参数通过本机方法
- 无法调用本机方法 Eclipse
- Java:调用本机方法,给出"线程"main"java.lang.UnsatisfiedLinkError中的异常"
- 如果未在本机方法中创建,何时清除本地引用
- java.lang.UnsatisfiedLinkError: 找不到本机方法: soundtouch.ST.setup
- 通过JNI调用System.loadLibrary()不会加载本机方法
- 使用C++时找不到本机方法
- JNI——可以将复杂类型作为本机方法参数传递
- 为什么 fopen 由于来自 Android-NDK 应用程序的权限问题而在本机方法中失败
- Java 端找不到我的本机方法
- 通过.NET中的指针从本机方法返回数据
- java.lang.UnsisfiedLinkError:未找到本机方法: