OpenCV for Android 使用(Linux)

本文介绍了在Linux环境下使用OpenCV for Android时遇到的构建问题,包括NDK的配置、Eclipse的设置、Android.mk文件的修正以及解决 UnsatisfiedLinkError。通过解决这些问题,成功编译并运行了一个简单的Demo Project,演示了如何在Android中使用OpenCV。然而,在运行时遇到了找不到库的问题,通过分析发现System.loadLibrary()的使用不当,修正后解决了问题。
摘要由CSDN通过智能技术生成

OpenCV for Android 使用(Linux)


根据OpenCV4Android的文档一步步往下走。

导入这些项目后,出现如下的构建问题:

* Build of configuration Default for project OpenCV Tutorial 2 - Mixed Processing *
/ndk-build.cmd
Cannot run program “/ndk-build.cmd”: Unknown reason
Error: Program “/ndk-build.cmd” is not found in PATH
PATH=[/home/vonzhou/software/android-sdk-linux/platform-tools:/home/vonzhou/software/android-sdk-linux/tools:/home/vonzhou/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games]
* Build Finished *

主要原因是:

Warning After the initial import, on a non-Windows (Linux and Mac OS) operating system Eclipse will still show build errors for applications with native C++ code. To resolve the issues, please do the following:
Open Project Properties -> C/C++ Build, and replace “Build command” text to “${NDKROOT}/ndk-build” (remove .cmd at the end).

当然要确保安装了NDK。

The Native Development Kit (NDK) is a set of tools that allow you to leverage C and C++ code in your Android apps. You can use it either to build from your own source code, or to take advantage of existing prebuilt libraries.

  • 下载android-ndk-r10e-linux-x86.bin(我是Linux)[]
  • 运行该文件可以解压缩
  • 配置Eclipse中的NDK路径:Window -> Preferences -> Android -> NDK
  • 不要忘了设置NDKROOT环境变量啊
  • 右键选择Properties->c/c++ build 改ndk-build.cmd -> ndk-build
  • 此外,Android.mk中不能出现空格

经过反复折腾,从opencv for android sdk中导入的project没有错误了

如果这时你运行那些实例,(在AVD中)你会被告知“OpenCV Manager package was not installed ….” ,SO 我们需要安装那个apk!(那个apk在哪儿?在OpenCV-android-sdk/apk下面,选择对应的版本,然后copy到android sdk platformt-tools下面,运行adb进行安装,这样就安装到了我们的AVD中),看图:

这里写图片描述


接下来写个简单的Demo Project 来展示Android中对opencv的使用

利用javah工具通过Class文件的本地函数声明,生成.h头文件,这里得到 com_example_test_ImageProc.h

Usage: javah [options]
where [options] include:
-help Print this help message and exit
-classpath Path from which to load classes
-bootclasspath Path from which to load bootstrap classes
-d

Output directory
-o Output file (only one of -d or -o may be used)
-jni Generate JNI-style header file (default)
-version Print version information
-verbose Enable verbose output
-force Always write output files
are specified with their fully qualified names (for
instance, java.lang.Object).

把这个头文件(可以重命名)放到我们的jni folder下(将在这里写C/C++代码),接下来会构建ImageProc.c 已经makefile文件。
接下来使用ndk-build命令来得到共享库文件(要切换到jni folder下面哦),比如libabc.so,所以你在Java程序中能够System.load这个module!

这里写图片描述
然后运行这个Android app, 显然遇到了问题

06-16 10:53:32.354: E/AndroidRuntime(832): FATAL EXCEPTION: main
06-16 10:53:32.354: E/AndroidRuntime(832): java.lang.UnsatisfiedLinkError: Cannot load library: load_library(linker.cpp:745): library “image_proc” not found
06-16 10:53:32.354: E/AndroidRuntime(832): at java.lang.Runtime.load(Runtime.java:340)
06-16 10:53:32.354: E/AndroidRuntime(832): at java.lang.System.load(System.java:521)
06-16 10:53:32.354: E/AndroidRuntime(832): at com.example.test.MainActivity1.onManagerConnected(MainActivity.java:29) 06-16 10:53:32.354: E/AndroidRuntime(832): at org.opencv.android.AsyncServiceHelper 1.onManagerConnected(MainActivity.java:29)061610:53:32.354:E/AndroidRuntime(832):atorg.opencv.android.AsyncServiceHelper 1.onServiceConnected(AsyncServiceHelper.java:318)
06-16 10:53:32.354: E/AndroidRuntime(832): at android.app.LoadedApkServiceDispatcher.doConnected(LoadedApk.java:1101) 06-16 10:53:32.354: E/AndroidRuntime(832): at android.app.LoadedApk ServiceDispatcher.doConnected(LoadedApk.java:1101)061610:53:32.354:E/AndroidRuntime(832):atandroid.app.LoadedApk ServiceDispatcherRunConnection.run(LoadedApk.java:1118) 06-16 10:53:32.354: E/AndroidRuntime(832): at android.os.Handler.handleCallback(Handler.java:725) 06-16 10:53:32.354: E/AndroidRuntime(832): at android.os.Handler.dispatchMessage(Handler.java:92) 06-16 10:53:32.354: E/AndroidRuntime(832): at android.os.Looper.loop(Looper.java:137) 06-16 10:53:32.354: E/AndroidRuntime(832): at android.app.ActivityThread.main(ActivityThread.java:5041) 06-16 10:53:32.354: E/AndroidRuntime(832): at java.lang.reflect.Method.invokeNative(Native Method) 06-16 10:53:32.354: E/AndroidRuntime(832): at java.lang.reflect.Method.invoke(Method.java:511) 06-16 10:53:32.354: E/AndroidRuntime(832): at com.android.internal.os.ZygoteInit RunConnection.run(LoadedApk.java:1118)061610:53:32.354:E/AndroidRuntime(832):atandroid.os.Handler.handleCallback(Handler.java:725)061610:53:32.354:E/AndroidRuntime(832):atandroid.os.Handler.dispatchMessage(Handler.java:92)061610:53:32.354:E/AndroidRuntime(832):atandroid.os.Looper.loop(Looper.java:137)061610:53

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值