android - 在 Android 2.3.3 上使用 OpenCv 的 native 代码时引发 UnsatisfiedLinkError

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

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

这就是问题所在,我得到一个 UnsatisfiedLinkError当我尝试使用 System.loadLibrary( 加载共享库时抛出异常) 在 Java 代码中。我已经尝试对 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实现 native 功能的文件:
#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源代码的静态 block 更改为
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-v7aarmeabi对于 Application.mk 中的 abi 版本变量文件。

对于上述所有更改,为了确保库文件已加载到应用程序的 lib 文件夹中,我执行了
adb push <path to library on disk> <path to /lib in app> 

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

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

最佳答案

Used dynamic linking by copying the libopencv_java.so and the static *.a library files into the (Project dir)/libs and (Project dir)/obj/local folders and changed static block of java source code to



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

你还有:
public native String funtionName1();

但是在 native c 代码中只有这些功能:
jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj) // mistake?
jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj)

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

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

关于android - 在 Android 2.3.3 上使用 OpenCv 的 native 代码时引发 UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11150555/

相关文章:

linux - 遇到错误 "*** glibc detected *** free(): invalid next size (fast)"

java - 我的通知未检索待处理 Intent 中的额外内容

java - 改造2:添加RequestInterceptor

opencv - 如何将RGB888Pixel图像复制到RGB字节流数组?

opencv - 如何在opencv中从侧面去除线条?

java - 安卓NDK。未找到原生 Lcom 的实现

java - 对话框上的 NullPointerException - Android

android - 销毁所有 fragment 后显示空白 Activity

c++ - OpenCV 让用户选择打开图像

opencv - 将 Mat 数组从 jni 返回到 java