我正在尝试使用使用JNI的库。
我已经尝试过开发人员提供的示例应用程序,但它确实有效。所以我知道这不是图书馆的错误。
我认为在导入库的过程中我做错了什么:
将jniRTSP.java(总结如下)复制到我的项目中:
public class jniRTSP {
private volatile static jniRTSP libRTSP = null;
public static jniRTSP getInstance() {
if(null == libRTSP) {
synchronized(jniRTSP.class) {
if(null == libRTSP) {
libRTSP = new jniRTSP();
libRTSP.InitProductList();
// DEBUG
libRTSP.SetDebugView(1);
}
}
}
return libRTSP;
}
static {
try {
System.loadLibrary("jniRTSP");
} catch (Exception e) {
e.printStackTrace();
}
}
public native int GetBrandEnableRecorder();
public native int GetBrandEnableLocal();
public native int GetBrandEnableRemote();
...
然后在我的onCreate()中,我尝试调用其中一个方法:
jniRTSP.getInstance().Init(.....)
返回错误:
UnsatisfiedLinkError:未找到本机方法com.myuniquepackage.jniRTSP.InitProductList :()I
UPDATE(FIX):我没有复制jniRTSP java文件,而是复制了包含它的整个包,保留了相同的包名。我不确定这是否修复它因为包名是问题,或者因为它需要该包中的其他java文件之一。虽然我很确定它是否是一个丢失的文件,但它会在编译时抱怨。
答案 0 :(得分:2)
相当确定包声明在C代码中必须与Java代码相同。
所以类jniRTSP应该在Java的com.myuniquepackage包中并且声明了本机方法InitProductList,并且C代码应该具有声明为Java_com_myuniquepackage_jniRTSP_InitProductList的方法
通过移动类,您可能正在破坏链接,更改Java中的包声明以匹配演示项目并查看它是否有效,如果可以,您可以将其更改回来然后在C代码中更改它更耗时但很容易。