Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未满足LinkError:未找到本机方法(不是由此错误的常见原因引起的)_Java_Android_Java Native Interface - Fatal编程技术网

Java 未满足LinkError:未找到本机方法(不是由此错误的常见原因引起的)

Java 未满足LinkError:未找到本机方法(不是由此错误的常见原因引起的),java,android,java-native-interface,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() {

我正在尝试使用一个使用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(.....)
    
    返回错误:

    未满足链接错误:未找到本机方法com.myuniquepackage.jniRTSP.InitProductList:()I


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

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

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


通过移动类,您可能会破坏链接,更改Java中的包声明以匹配演示项目,并查看它是否有效,如果有效,您可以将其更改回来,然后在C代码中更改它,这会花费一些时间,但足够简单。

调用
loadLibrary
是否真的成功了?另外,您确定jniRTSP方法使用的是.NET大写约定,而不是小写首字母吗?只有两个“常见的”:library not found和method not found,这是其中之一。@chrylis Yep是的,否则他会得到“UnsatisfiedLinkError找不到库'jniRTSP'”在此之前发生错误。@RyanfaeScotland我从未注意到这是一个
错误
,而不是
异常
!不,我只是复制了整个jniRTSP.java文件。而且我认为我没有访问C代码的权限,它打包在。soAre包声明在每个项目中都是一样的吗?根据您复制代码的方式,它们可能已自动更改。