【问题标题】:UnsatisfiedLinkError thrown while using native code for OpenCv on Android 2.3.3在 Android 2.3.3 上使用 OpenCv 的本机代码时引发 UnsatisfiedLinkError
【发布时间】: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.mkApplication.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


    【解决方案1】:

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

    您只需将libopencv_java.so(不需要*.a 文件)复制到(Project dir)/libs/armeabi-v7a

    你还有:

    public native String funtionName1();
    

    但是在原生 c 代码中只有这些函数:

    jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj) // mistake?
    jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj)
    

    好像第一个函数的名字是错误的。

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

    【讨论】:

    • 我把第一个函数的名字改了,然后尝试在手机上运行app,还是抛出了unsatisfied link错误异常。我已经尝试了很多其他地方提到的修复,但都没有成功。我已经包含了 javah 生成的头文件,尝试了动态链接,确保库在手机中的正确路径中。
    • 另外,在尝试通过将行 OPENCV_LIB_TYPE:=STATIC 添加到 Android.mk 来尝试静态链接时,库没有构建,而是我得到了似乎无穷无尽的编译时错误,我不得不停止使用 Ctrl+C。这是否可以指出代码中某处的某些差异?另外,我使用的是 Windows 7,NDK 的 android 开发者页面显示它与 Windows 7 不兼容。这是问题所在吗?
    • 这是我所说的一些乱码输出: (.text._Z25cvHaarDetectObjectsForROCPKvP23CvHaarClassifierCascadeP12CvM emStomake: *** [obj/local/armeabi-v7a/libocvtest3.so] 错误 3 终止批处理作业 (Y /N)? y
    • @Shishir 你是否尝试运行 opencv 3 示例?
    • 我能够成功构建教程 3 的库,但是当我运行该应用程序时,我再次收到不满意的链接错误异常。
    猜你喜欢
    • 2011-11-30
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2018-06-13
    相关资源
    最近更新 更多