在Android 2.3.3上使用OpenCv的本机代码时引发的UnsatifiedLinkError
我想在Android 2.3.3中使用OpenCV 2.4.0本机代码。为此,我使用NDKrelease-8在Windows7上使用在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
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构建库,但是当我运行应用程序时,我再次遇到了不满意的链接错误异常。