【发布时间】:2012-06-24 10:03:58
【问题描述】:
我想在 Android 2.3.3 中使用 OpenCV 2.4.0 本机代码。为此,我使用 NDK release-8 在 Windows 7 上使用 ndk-build.cmd 脚本构建了 lib.so 共享库。我使用 Eclipse 创建了一个项目并构建了 .apk 文件。
这就是问题所在,当我尝试在 Java 代码中使用 System.loadLibrary() 加载共享库时,我得到了一个 UnsatisfiedLinkError 异常。我试过用 NDK 中的 hello-jni 示例做同样的事情,它工作得非常好。
我按照this page 上的说明创建项目并编写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
我已经用谷歌搜索了这个问题并尝试了解决方案,即使在实施了这些解决方案之后,我也得到了这个异常。这是我到目前为止尝试过的所有事情:
通过将libopencv_java.so和静态*.a库文件复制到(Project dir)/libs和(Project dir)/obj/local文件夹来使用动态链接,并将java源代码的静态块更改为
static
{
System.loadLibrary("opencv_java");
System.loadLibrary("ocvtest");
}
通过添加OPENCV_LIB_TYPE:=STATIC 来使用静态链接,如下所示
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
include (<Path to Opencv.mk>)
使用动态链接时在命令提示符下执行javah.exe my.package.OCVTest1生成的包含头文件。
将 Application.mk 文件中的 abi 版本变量的 armeabi-v7a 更改为 armeabi。
对于上述所有更改,为了确保库文件已加载到应用程序的 lib 文件夹中,我执行了
adb push <path to library on disk> <path to /lib in app>
将库文件复制到手机上的正确目录中。
尝试所有这些修复后,我仍然无法解决此异常。
【问题讨论】:
标签: android opencv java-native-interface android-ndk