Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
在Android 2.3.3上使用OpenCv的本机代码时引发的UnsatifiedLinkError_Android_Opencv_Java Native Interface_Android Ndk - Fatal编程技术网

在Android 2.3.3上使用OpenCv的本机代码时引发的UnsatifiedLinkError

在Android 2.3.3上使用OpenCv的本机代码时引发的UnsatifiedLinkError,android,opencv,java-native-interface,android-ndk,Android,Opencv,Java Native Interface,Android Ndk,我想在Android 2.3.3中使用OpenCV 2.4.0本机代码。为此,我使用NDKrelease-8在Windows7上使用ndkbuild.cmd脚本构建lib.so共享库。我使用Eclipse创建了一个项目并构建了.apk文件 问题是,当我尝试在Java代码中使用System.loadLibrary()加载共享库时,抛出了一个unsatifiedlinkerror异常。我在NDK中尝试过用hello jni示例做同样的事情,效果非常好 我按照上的说明创建项目和编写Android.mk

我想在Android 2.3.3中使用OpenCV 2.4.0本机代码。为此,我使用NDKrelease-8在Windows7上使用
ndkbuild.cmd
脚本构建
lib.so
共享库。我使用Eclipse创建了一个项目并构建了.apk文件

问题是,当我尝试在Java代码中使用
System.loadLibrary(
)加载共享库时,抛出了一个
unsatifiedlinkerror
异常。我在NDK中尝试过用hello jni示例做同样的事情,效果非常好

我按照上的说明创建项目和编写
Android.mk
Application.mk
文件

以下是我的java代码:

package my.package.ocvtest1
// import android.foo.bar statements

public class OCVTest1 extends Activity
{

    public void onCreate(Bundle savedInstance)
    {
        super.onCreate(Bundle savedInstance)
        // code to display strings returned by native functions
    }

    public native String funtionName1();
    public native String functionName2();

    static
    {
        System.loadLibrary("ocvtest1");
    }

}
下面是实现本机函数的
(Project dir)/jni/ocvtest1.c
文件:

#include <jni.h>

// Other header files and some global variables

jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj)
{
    // code here
}

jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj)
{
    // code here   
}

// End of file
jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj) // mistake?
jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj)
通过添加
OPENCV_LIB_TYPE:=static
使用静态链接,如下所示

include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
include (<Path to Opencv.mk>)
将库文件复制到手机的正确目录中

在尝试了所有这些修复之后,我仍然无法解决此异常

通过复制libopencv_java.so和静态 *.a库文件保存到(Project dir)/libs和(Project dir)/obj/local文件夹中,并将java源代码的静态块更改为

static
{
    System.loadLibrary("opencv_java");
    System.loadLibrary("ocvtest");
}
您只需将
libopencv_java.so
*.a
文件不需要)复制到
(项目目录)/libs/armeabi-v7a

此外,你还有:

public native String funtionName1();
但在本机c代码中,只有以下函数:

#include <jni.h>

// Other header files and some global variables

jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj)
{
    // code here
}

jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj)
{
    // code here   
}

// End of file
jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj) // mistake?
jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj)
第一个函数的名称似乎是错误的


这应该可以解决您的问题。

我更改了第一个函数的名称,然后尝试在手机上运行该应用程序,但仍然抛出“未满足链接错误”异常。我尝试了很多其他地方提到的修复,但都没有成功。我已经包含了javah生成的头文件,尝试了动态链接,确保LIB在手机中的正确路径。另外,在尝试静态链接时,我在Android.mk中添加了行
OPENCV_LIB_TYPE:=static
,这些库不是构建的,相反,我得到了似乎无穷无尽的编译时错误,我不得不停止使用Ctrl+C。这是否表明代码中存在一些差异?另外,我正在使用Windows7,NDK的android开发者页面说它与Windows7不兼容。这就是问题所在吗?这是我所说的一些胡言乱语的输出:(.text.\u z25cvhaardtectObjectsFrorCPKVP23CvHaarClassificateCadep12CVM emtomake:**[obj/local/armeabi-v7a/libocvtest3.so]错误3终止批处理作业(Y/N)? y@Shishir你试过运行opencv 3示例吗?我能够成功地为教程3构建库,但是当我运行应用程序时,我再次遇到了不满意的链接错误异常。