在Ubuntu下用ndk-build编译一个链接opencv库的cpp文件生成一个在安卓机上跑的执行文件

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 17:57   168   0

首先要配置好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 #




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP