Android.mk和Application.mk构建OpenCV 3.2

时间:2017-01-09 21:04:06

标签: android opencv android-studio android-ndk

我已下载OpenCV for Android 版本3.2 并将其java模块导入我的项目。我已将原生(c ++)代码复制到openCVLibrary320/app/src/main/jni中的模块目录中。

如何创建Application.mk和Android.mk来编译这个sdk? (据我所知,ndk-build需要这两个文件)

3 个答案:

答案 0 :(得分:0)

如果您想为OpenCV使用Java API,那么您可以查看此post

但是,如果您想在NDK端使用带有C/C++代码的预构建OpenCV静态库,那么只需要Android.mkApplication.mk。在我的这些.mk文件版本中,我从驱动器上的某个位置动态加载所需的预构建库。因此在构建时,.mk文件将加载所需的静态库。

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Location of SDK on my drive
OPENCVROOT := ${HOME}/opencv-sdk-android
OPENCV_CAMERA_MODULES := off
OPENCV_INSTALL_MODULES := on
OPENCV_LIB_TYPE := STATIC
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk

# Load your local .cpp and .h files here.
LOCAL_SRC_FILES := hello-jni.c

LOCAL_LDLIBS := -lm -llog -ldl -lz
LOCAL_CPPFLAGS += -fexceptions -frtti -std=c++11
LOCAL_LDFLAGS += -ljnigraphics

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS += -fexceptions -frtti -std=c++11 -D__STDC_CONSTANT_MACROS

APP_ABI := all
APP_PLATFORM=android-14

答案 1 :(得分:0)

很容易按照我的观点来做,

  1. 导入您的Opencv(就像您已经这样)
  2. 现在转到您的项目结构选择应用程序而不是添加新依赖项并选择您的opencv模块单击确定
  3. 克里特一个类称它为NativeClass.java,它将包含你的原生函数和变量
  4. 在您的nativeClass.java中从JNI创建方法getMessage并构建它 enter image description here
  5. 现在打开终端并打开这个

    1)  cd app/src/main
    
    2)  javah -d jni -classpath ../../build/intermediates/classes/debug write_your_Pakage_Name.className
     My pakage name is com.example.cvlab.ndktest
     class name -->nativeClass
    

    enter image description here

  6. 当你在终端点击输入上面的代码时,它将创建jni文件夹,它将有头文件
  7. 现在复制头文件并将其传递到同一文件夹中,但写下 .cpp 而不是 .h
  8. 从头文件复制函数jni函数并超过cpp文件中的函数 enter image description here
  9. 构建如果显示错误goto gradle文件并写入 的 android.usedeprecatedndk =真
  10. 现在在您的jni文件夹中创建android.mk文件并添加此代码

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    #opencv
    OPENCVROOT:= your opencv location
    OPENCV_CAMERA_MODULES:=on
    OPENCV_INSTALL_MODULES:=on
    OPENCV_LIB_TYPE:=SHARED
    include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk
    
    LOCAL_SRC_FILES := your cpp file name
    
    LOCAL_LDLIBS += -llog
    LOCAL_MODULE := MyLibs
    
    include $(BUILD_SHARED_LIBRARY)
    
  11. 现在创建Application.mk文件并编写此代码

    APP_STL := gnustl_static
    APP_CPPFLAGS := -frtti -fexceptions
    APP_ABI := armeabi-v7a
    APP_PLATFORM := android-16
    
  12. 现在转到你的build.gradel文件,然后defultConfiguation把这个

        sourceSets.main {
        jni.srcDirs = [] //disable automatic ndk-build call
    }
    task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
        commandLine "C:/Users/do/AppData/Local/Android/sdk/ndk-bundle /ndk-build.cmd",
                'NDK_PROJECT_PATH=build/intermediates/ndk',
                'NDK_LIBS_OUT=src/main/jniLibs',
                'APP_BUILD_SCRIPT=src/main/jni/Android.mk',
                'NDK_APPLICATION_MK=src/main/jni/Application.mk'
    }
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
    

    注意:如果你安装了你的android stdk和ndk而不是你必须在commond line中给这个文件夹位置,就像这样 C:/ Users / do / AppData / Local / Android / sdk / ndk-bundle

  13. 现在构建它将创建 jnilibs fodler 并且它将包含你的libs文件

  14. 现在转到你的mainjava文件并加载

  15.   

    static {       的System.loadLibrary( “MyLibs”);         }

    1. 调用您的本机代码编写NativeClass.getMessageFromJNI() 并在文本视图中显示 enter image description here

答案 2 :(得分:0)

虽然您已为Android.mk请求了ndk-build,但我建议CMake CMakeLists.txt建议将其用于原生项目。

在这种情况下,您可以查看Android Developers,它提供了两种解决方案,可将OpenCV 3.2.0 SDK集成到Android项目/应用程序中。该实现提供了适当且经过测试的集成,它利用OpenCV SDK中的-keepclassmembers class mx.ferreyra.callnumber.CFCallNumber { boolean execute(java.lang.String, ...rest of signature); void callPhone(org.json.JSONArray); } 脚本来正确构建和链接库模块(包括第三方和SDK库),并且还包含要编码的头文件本机C / C ++类,它们是项目的一部分。