|
首先要配置好ndk
将编译好的ndk放在 /opt目录下
archermind@flm:/opt$ ls
android-ndk-r14b arm-linux-androideabi
其中android-ndk-r14b就是ndk的根目录,arm-linux-androideabi是我从这个ndk中分离出来的交叉编译工具链
在~/.bashrc中设置环境变量
export PATH=$PATH:/opt/android-ndk-r14b:/opt/arm-linux-androideabi/bin
前面一个是包含ndk-build的路径,后面一个是导出的交叉编译工具的路径
然后我们在~/test下建立一个jni目录
archermind@flm:~$ mkdir -p ~/test/jni
然后在jni里加上如下文件
─ jni
├─ Android.mk
├─ Application.mk
├─ include
│ ├── opencv
│ └── opencv2
├── libopencv_java.so
└── test.cpp
archermind@flm:~/test/jni$ ls
Android.mk Application.mk include libopencv_java.so test.cpp
archermind@flm:~/test/jni/include$ ls
opencv opencv2
archermind@flm:~/test/jni$ cat Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_PATH :=$(LOCAL_PATH)
NDK_APP_DST_DIR := $(LOCAL_PATH)
LOCAL_SRC_FILES += test.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_LDFLAGS += -L$(LOCAL_PATH)
LOCAL_LDLIBS += -pie -fPIE -lopencv_java -std=c++11
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE:= test
#include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_STATIC_LIBRARY)
include $(BUILD_EXECUTABLE)
archermind@flm:~/test/jni$ cat Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-15
archermind@flm:~/test/jni$ cat test.cpp
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/ocl/ocl.hpp"
using namespace cv;
using namespace std;
int main()
{ Mat src = Mat::ones(1000, 1000, CV_8UC1);
double tt = getTickCount(); ocl::oclMat srcl = ocl::oclMat(src), dstcl; ocl::bilateralFilter(srcl, dstcl, 20, 20, 20); Mat copy = Mat(srcl); tt = getTickCount() - tt; printf("consequence: %f\n", 1000.0*tt/cvGetTickFrequency()); return 0;
}
而libopencv_java.so是从编译好的opencv里得到的
D:\share3\OpenCV-2.4.9-android-sdk\sdk\native\libs\armeabi-v7a\libopencv_java.so
include 则是在opencv的源码里面拿来的
D:\opencv2.4.9\sources\include
接着执行编译
archermind@flm:~/test/jni$ ndk-build
Android NDK: WARNING:/home/archermind/test/jni/Android.mk:test: non-system libraries in linker flags: -lopencv_java
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
[armeabi-v7a] Compile++ thumb: test <= test.cpp
[armeabi-v7a] Executable : test
[armeabi-v7a] Install : test => libs/armeabi-v7a/test
这样就生成了我们需要的执行文件test
archermind@flm:~/test/libs/armeabi-v7a$ ls
test接着我们将这个test文件push到android机上
C:\adb1031>adb push test /data
C:\adb1031>adb shell
amt6757_wifi_n:/data # chmod +x test
amt6757_wifi_n:/data # ./test
consequence: 729146154.000000
amt6757_wifi_n:/data #
|