UnsatisfiedLinkError:找不到本机方法(不是由此错误的常见原因引起)

时间:2013-10-15 23:23:42

标签: java android java-native-interface

我正在尝试使用使用JNI的库。

我已经尝试过开发人员提供的示例应用程序,但它确实有效。所以我知道这不是图书馆的错误。

我认为在导入库的过程中我做错了什么:

  • 将.so文件复制到我的libs文件夹(名为libjniRTSP.so)
  • 将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文件之一。虽然我很确定它是否是一个丢失的文件,但它会在编译时抱怨。

1 个答案:

答案 0 :(得分:2)

相当确定包声明在C代码中必须与Java代码相同。

所以类jniRTSP应该在Java的com.myuniquepackage包中并且声明了本机方法InitProductList,并且C代码应该具有声明为Java_com_myuniquepackage_jniRTSP_InitProductList的方法

通过移动类,您可能正在破坏链接,更改Java中的包声明以匹配演示项目并查看它是否有效,如果可以,您可以将其更改回来然后在C代码中更改它更耗时但很容易。