0

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

这是问题所在,UnsatisfiedLinkError当我尝试System.loadLibrary(在 Java 代码中使用 ) 加载共享库时抛出异常。我已经尝试对 NDK 中的hello-jni示例做同样的事情,它工作得非常好。

我按照此页面上的说明创建项目并编写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为文件armeabi中的 abi 版本变量Application.mk

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

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

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

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

4

1 回答 1

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)

似乎第一个函数的名称是错误的。

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

于 2012-06-22T05:47:59.897 回答