#前一篇帖子实验了build_sdk.py来编译opencv,失败了。
#本篇尝试使用cmake来编译
#感谢这篇帖子提供的指导:https://www.cnblogs.com/jojodru/p/10025658.html
#
cd /home/ahfu
#选择opencv 3.4.6版本来编译
wget https://github.com/opencv/opencv/archive/3.4.6.tar.gz
tar -zxvf opencv-3.4.6.tar.gz
wget https://codeload.github.com/opencv/opencv_contrib/tar.gz/3.4.6
tar -zxvf opencv_contrib-3.4.6.tar.gz
#下载ndk
wget https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
unzip android-ndk-r14b-linux-x86_64.zip
export PATH=$PATH:/home/ahfu/android-ndk-r14b
# 注意,我一开始使用了NDK版本 android-ndk-r19c-linux-x86_64.zip,结果一堆问题
#下载ANDROID SDK
wget https://dl.google.com/android/repository/tools_r25.2.5-linux.zip
unzip tools_r25.2.5-linux.zip
export PATH=$PATH:/home/ahfu/
# 注意,一开始我下载了android sdk版本 android-sdk_r24.4.1-linux.tgz,有问题

#建立编译目录
cd opencv-3.4.6
mkdir build && cd build
#开始config
cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
-DCMAKE_TOOLCHAIN_FILE="/home/ahfu/opencv-3.4.6/platforms/android/android.toolchain.cmake" \
-DANDROID_NDK="/home/ahfu/android-ndk-r14b" \
-D ANDROID_SDK="/home/ahfu/android_sdk/tools" \
-DANDROID_NATIVE_API_LEVEL=24 \
-DANDROID_ABI="armeabi-v7a" \
-DANDROID_CPP_FEATURES="rtti exceptions" \
-DANDROID_ARM_NEON=TRUE \
-DANDROID_STL=gnustl_static \
-DCMAKE_BUILD_TYPE=Release \
-DOPENCV_EXTRA_MODULES_PATH="/home/ahfu/opencv_contrib-3.4.6/modules" \
-DCMAKE_INSTALL_PREFIX="/home/ahfu/opencv_3.4.6_install/" \
-D BUILD_opencv_java=OFF \
-D BUILD_ANDROID_PROJECTS=OFF \
-D BUILD_ANDROID_EXAMPLES=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_opencv_features2d=OFF \
-D BUILD_FAT_JAVA_LIB=OFF \
-D BUILD_opencv_aruco=OFF \
-D BUILD_opencv_calib3d=OFF \
-D WITH_OPENCL=OFF \
-D WITH_CUDA=OFF \
-D WITH_MATLAB=OFF \
../
#或者指定所有组件的选项

cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
-DCMAKE_TOOLCHAIN_FILE="/home/ahfu/opencv-3.4.6/platforms/android/android.toolchain.cmake" \
-DANDROID_NDK="/home/ahfu/android-ndk-r14b" \
-DANDROID_NATIVE_API_LEVEL=24 \
-DANDROID_ABI="armeabi-v7a" \
-DANDROID_CPP_FEATURES="rtti exceptions" \
-DANDROID_ARM_NEON=TRUE \
-DANDROID_STL=gnustl_static \
-DCMAKE_BUILD_TYPE=Release \
-DOPENCV_EXTRA_MODULES_PATH="/home/ahfu/opencv_contrib-3.4.6/modules" \
-DCMAKE_INSTALL_PREFIX="/home/ahfu/opencv_3.4.6_install/" \
-D BUILD_opencv_java=OFF \
-D BUILD_ANDROID_PROJECTS=OFF \
-D BUILD_ANDROID_EXAMPLES=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_FAT_JAVA_LIB=OFF \
-D BUILD_opencv_apps =ON \
-D BUILD_opencv_aruco =ON \
-D BUILD_opencv_bgsegm =ON \
-D BUILD_opencv_bioinspired =ON \
-D BUILD_opencv_calib3d =OFF \
-D BUILD_opencv_ccalib =ON \
-D BUILD_opencv_core =ON \
-D BUILD_opencv_datasets =ON \
-D BUILD_opencv_dnn =ON \
-D BUILD_opencv_dnn_objdetect =ON \
-D BUILD_opencv_dpm =ON \
-D BUILD_opencv_face =ON \
-D BUILD_opencv_features2d =OFF \
-D BUILD_opencv_flann =ON \
-D BUILD_opencv_fuzzy =ON \
-D BUILD_opencv_hfs =ON \
-D BUILD_opencv_highgui =OFF \
-D BUILD_opencv_img_hash =ON \
-D BUILD_opencv_imgcodecs =ON \
-D BUILD_opencv_imgproc =ON \
-D BUILD_opencv_java_bindings_gen =OFF \
-D BUILD_opencv_js =OFF \
-D BUILD_opencv_line_descriptor =ON \
-D BUILD_opencv_ml =ON \
-D BUILD_opencv_objdetect =ON \
-D BUILD_opencv_optflow =ON \
-D BUILD_opencv_phase_unwrapping =ON \
-D BUILD_opencv_photo =ON \
-D BUILD_opencv_plot =ON \
-D BUILD_opencv_reg =ON \
-D BUILD_opencv_rgbd =ON \
-D BUILD_opencv_saliency =ON \
-D BUILD_opencv_shape =ON \
-D BUILD_opencv_stereo =ON \
-D BUILD_opencv_stitching =ON \
-D BUILD_opencv_structured_light =ON \
-D BUILD_opencv_superres =ON \
-D BUILD_opencv_surface_matching =ON \
-D BUILD_opencv_text =ON \
-D BUILD_opencv_tracking =ON \
-D BUILD_opencv_video =ON \
-D BUILD_opencv_videoio =ON \
-D BUILD_opencv_videostab =ON \
-D BUILD_opencv_world =ON \
-D BUILD_opencv_xfeatures2d =OFF \
-D BUILD_opencv_ximgproc =ON \
-D BUILD_opencv_xobjdetect =ON \
-D BUILD_opencv_xphoto =ON \
-D WITH_ARITH_DEC =ON \
-D WITH_ARITH_ENC =ON \
-D WITH_CAROTENE =ON \
-D WITH_CLP =ON \
-D WITH_CPUFEATURES =ON \
-D WITH_CUDA =OFF \
-D WITH_FFMPEG =ON \
-D WITH_GDCM =ON \
-D WITH_GSTREAMER_0_10 =ON \
-D WITH_HALIDE =ON \
-D WITH_IMGCODEC_HDR =ON \
-D WITH_IMGCODEC_PXM =ON \
-D WITH_IMGCODEC_SUNRASTER =ON \
-D WITH_INF_ENGINE =ON \
-D WITH_ITT =ON \
-D WITH_JASPER =ON \
-D WITH_JPEG =ON \
-D WITH_OPENCL =OFF \
-D WITH_OPENCL_SVM =OFF \
-D WITH_OPENEXR =ON \
-D WITH_OPENMP =ON \
-D WITH_OPENVX =ON \
-D WITH_PNG =ON \
-D WITH_PROTOBUF =ON \
-D WITH_PTHREADS_PF =ON \
-D WITH_QUIRC =ON \
-D WITH_TBB =ON \
-D WITH_TIFF =ON \
-D WITH_WEBP =ON \
../

  

#执行完成后,如果需要进一步配置更多选项,可以执行
ccmake ..
#开始编译
make -j 40
make install

下面是我的用于测试的程序:

//jpg2bmp.cpp
#include <stdio.h>
#include <inttypes.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp> #ifndef P
#define P(format, ...) do \
{ \
printf("%s %s %d " format "\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
fflush(stdout); \
} \
while (0);
#endif int main(int argc, char* argv[]){
if (argc<3){
printf("usage:%s <from> <to>\n", argv[0]);
return 0;
}
cv::Mat image = cv::imread(argv[1], cv::IMREAD_UNCHANGED);
if (image.empty()){
P("load pic %s fail", argv[1]);
return -1;
}
cv::Mat bmp;
cv::cvtColor(image, bmp, cv::COLOR_BGR2GRAY);
cv::imwrite(argv[2], bmp);
P("ok");
return 1;
} /*
ndk-build NDK_LOG=1 V=1 NDK_DEBUG=1 NDK_PROJECT_PATH=$(pwd) NDK_APPLICATION_MK=./Application.mk APP_BUILD_SCRIPT=./Android.mk
*/

同一目录下用于编译的Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions -std=c++11 -fPIC
#注意:-fPIC一定要加,否则可执行程序在android上执行出现以下错误:
# Android 5.0 and later only support position-independent executables (-fPIE). APP_PLATFORM := android-24
# 注意:APP_PLATFORM一定要等于或者高于opencv编译时候的版本
# 否则链接的时候出现大量类似错误 undefined reference to 'rand'
APP_ABI := armeabi-v7a

Android.mk的内容:

include $(CLEAR_VARS)

LOCAL_PATH := ./

LOCAL_C_INCLUDES:=/home/ahfu/opencv_3.4.6_install/sdk/native/jni/include

LOCAL_ARM_NEON := true
LOCAL_CFLAGS:=-g -pie -fPIC -DANDROID_ARM_NEON=TRUE -DANDROID_TOOLCHAIN=clang
LOCAL_LDLIBS += \
-L"/home/ahfu/opencv_3.4.6_install/sdk/native/staticlibs/armeabi-v7a" -lopencv_core -lopencv_imgcodecs -lopencv_imgproc -lm -lz -landroid -llog \
-L"/home/ahfu/opencv_3.4.6_install/sdk/native/3rdparty/libs/armeabi-v7a" -ltegra_hal -lcpufeatures -llibpng -llibjpeg-turbo -llibtiff -llibjasper -llibwebp -lIlmImf \
-lopencv_core -lopencv_imgcodecs -lopencv_imgproc -ltegra_hal \
-L"/home/ahfu/android-ndk-r14b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/" \
-lgnustl_static -ldl
#注意:链接阶段出现了大量stl链接时候的错误
# 不明原因,但是我强制指定了STL的链接目录,问题解决
# 链接目录:android-ndk-r14b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/
# 链接库 -lgnustl_static LOCAL_MODULE := jpg2bmp LOCAL_SRC_FILES := jpg2bmp.cpp LOCAL_LDLIBS += -lm -llog
include $(BUILD_EXECUTABLE)

  

使用ndk-build命令编译:
ndk-build NDK_LOG=1 V=1 NDK_DEBUG=1 NDK_PROJECT_PATH=$(pwd) NDK_APPLICATION_MK=./Application.mk APP_BUILD_SCRIPT=./Android.mk

#下载到mac上,然后再传到android
sz -y libs/armeabi-v7a/jpg2bmp

#以下是mac终端
adb push ~/Downloads/jpg2bmp 1.jpg /data/local/tmp
adb shell
   cd /data/local/tmp
   ./jpg2bmp 1.jpg 2.bmp
   exit
adb pull /data/local/tmp/2.bmp ./
open 2.bmp
#看到一张bmp格式的灰度图,执行成功

  

在linux下编译android下的opencv,使用cmake的方法的更多相关文章

  1. linux环境下编译Android apk

    Android源码目录下的build/envsetup.sh文件,描述编译的命令 - m:       Makes from the top of the tree. - mm:      Build ...

  2. 【转】ubuntu 11.10(32位系统)下编译android源码

    原文网址:http://www.cnblogs.com/dwayne/archive/2011/11/16/2251734.html 本文介绍在ubuntu 11.10系统下编译android 2.3 ...

  3. 编译Android下可用的FFmpeg+x264

    编译Android下可用的FFmpeg+x264 编译x264: 下载最新版的x264 ftp://ftp.videolan.org/pub/videolan/x264/snapshots/ 1.解压 ...

  4. 在mac os下编译android -相关文章

    1. Mac OS X下编译Android源码 http://blog.csdn.net/bulreed/article/details/22783467 2.MAC OS 编译 Android源代码 ...

  5. MAC 下编译 ANDROID P 源码 提示 internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12" "10.13"]

    MAC 下编译 ANDROID P 源码出现下面的问题: ninja: no work to do. [21/21] out/soong/.bootstrap/bin/soong_build out/ ...

  6. 在SoCEDS环境下编译和更新preloader和uboot程序的方法

    在SoCEDS环境下编译和更新preloader和uboot程序的方法   前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloade ...

  7. ffmpeg学习笔记-Linux下编译Android动态库

    Android平台要使用ffmpeg就需要编译生成动态库,这里采用Ubuntu编译Android动态库 文件准备 要编译生成Android需要以下文件 NDK ffmpeg源代码 NDK下载 NDK可 ...

  8. 【转】在Ubuntu下编译Android源码并运行Emulator

    原文网址:http://www.mcuos.com/thread-4553-1-1.html 建立编译环境 1.在VirtualBox上安装Ubuntu 2.安装JDK   $ sudo apt-ge ...

  9. ubuntu下编译android jni到so库的mk文件配置

    项目根目录下的Android.mk文件 LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional L ...

随机推荐

  1. java File 类对操作系统文件目录进行操作:增删查

    File类 1,概述 File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成. 2,构造方法 public File(Strin ...

  2. SpringBoot整合nacos实现配置中心(配置动态更新)

    官方教程:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html Linux使用docker部署nacos:https://www.cnblo ...

  3. VS2013 or up version +常用插件

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 下载地址: https://github.com/mohistH/vs2013_extens ...

  4. 【LeetCode】1004. Max Consecutive Ones III 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 虫取法/双指针 日期 题目地址:https://le ...

  5. 【LeetCode】713. Subarray Product Less Than K 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/subarray ...

  6. 【剑指Offer】数值的整数次方 解题报告(Python)

    [剑指Offer]数值的整数次方 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  7. MCU变量加载过程

    前言 在开发mcu代码的时候经常会有些疑惑,变量是怎么在编译之后进入单片机的ram区的呢,特别是在使用keil开发的时候.后来在接触gcc编译器和自研的mcu后,终于明白了这个问题.实际上变量编译后被 ...

  8. Ubuntu复习笔记-认识Linux

    本次复习基于\(Ubuntu20.04\)的发行版进行总结,目的是更好记录自己学习的\(Linux\). 认识Linux 学习\(Linux\)之前,需要搞懂几个概念,\(Linux\)桌面操作系统与 ...

  9. 【优雅代码】04-1行代码完成多线程,别再写runnable了

    [优雅代码]04-1行代码完成多线程,别再写runnable了 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮 ...

  10. Hbase集群安装Version1.1.5

    Hbase集群安装,基于版本1.1.5, 使用hbase-1.1.5.tar.gz安装包. 1.安装说明 使用外部Zookeeper集群而非Hbase自带zookeeper, 使用Hadoop文件系统 ...