在Android 2.3.3上使用OpenCv的本机代码时抛出UnsatisfiedLinkError

时间:2012-06-22 05:18:39

标签: android opencv java-native-interface android-ndk

我想在Android 2.3.3中使用OpenCV 2.4.0本机代码。为此,我使用NDK release-8在Windows 7上使用lib.so脚本构建ndk-build.cmd共享库。我使用Eclipse创建项目并构建.apk文件。

这是问题,当我尝试在Java代码中使用UnsatisfiedLinkError加载共享库时,我得到了System.loadLibrary(异常。我尝试用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生成包含的头文件。

armeabi-v7a文件中的abi版本变量将armeabi更改为Application.mk

对于上述所有更改,为了确保库文件已加载到应用程序的lib文件夹中,我执行了

adb push <path to library on disk> <path to /lib in app> 

将库文件复制到手机上的正确目录中。

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

1 个答案:

答案 0 :(得分: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)

似乎第一个功能的名称是错误的。

那应该解决你的问题。