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
-dOutput 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)06−1610: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)06−1610: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)06−1610:53:32.354:E/AndroidRuntime(832):atandroid.os.Handler.handleCallback(Handler.java:725)06−1610:53:32.354:E/AndroidRuntime(832):atandroid.os.Handler.dispatchMessage(Handler.java:92)06−1610:53:32.354:E/AndroidRuntime(832):atandroid.os.Looper.loop(Looper.java:137)06−1610:53