0

我正在尝试使用一个使用 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

更新(修复):我不只是复制 jniRTSP java 文件,而是复制了包含它的整个包,并保持相同的包名。我不确定这是否修复了它,因为包名称是问题,或者是否因为它需要该包中的其他 java 文件之一。虽然我很确定它是否是一个丢失的文件,但它会在编译时抱怨。

4

1 回答 1

2

可以肯定的是,C 代码中的包声明必须与 Java 代码相同。

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

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

于 2013-10-15T23:42:46.010 回答