使用Android.mk和Application.mk构建OpenCV 3.2

6
我已经下载了OpenCV for Android版本3.2并将其Java模块导入我的项目中。我已将本地(c++)代码复制到openCVLibrary320/app/src/main/jni目录下的模块文件夹中。
我应该如何创建Application.mk和Android.mk以编译此SDK?(我知道ndk-build需要这两个文件)

1
这是一个旧版本的内容,但仍然可以帮到你:https://github.com/quanhua92/NDK_OpenCV_AndroidStudio - yakobom
不需要使用 .mk 文件,请参考此链接 https://github.com/jlhonora/opencv-android-sample - Mohammad Tauqir
3个回答

0

虽然您请求使用ndk-buildAndroid.mk,但我想建议使用Android Developers推荐用于本地项目的CMake

在这种情况下,您可以查看我的答案,其中提供了两种解决方案,将OpenCV 3.2.0 SDK集成到Android项目/应用程序中。该实现提供了适当且经过测试的集成,并利用OpenCV SDK中找到的CMakeLists.txt脚本正确构建和链接库模块(包括第三方和SDK库),并且还包括头文件以编写项目的本机C/C++类。


0

如果您想使用Java API来操作OpenCV,那么可以参考这篇文章

但是,如果您想在NDK端使用预构建的OpenCV静态库与C/C++代码一起使用,则只需要使用Android.mkApplication.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

你在哪里指定需要编译的C++文件? - MinhNguyen
更新于@MinhNguyen - ZdaR

0

很容易,跟随我的所有步骤,你就能做到。

  1. 导入Opencv (如您已经完成)
  2. 现在进入项目结构,选择应用程序,然后添加新依赖项并选择您的opencv模块,然后单击确定
  3. 创建名为NativeClass.java的类,它将包含您的本机函数和变量
  4. 在nativeClass.java中创建一个从JNI获取消息的方法,并构建 enter image description here
  5. 现在打开终端并输入以下代码

    1)  cd app/src/main
    
    2)  javah -d jni -classpath ../../build/intermediates/classes/debug write_your_Pakage_Name.className
     我的包名是com.example.cvlab.ndktest
     类名 -->nativeClass
    

    enter image description here

  6. 当您在终端中键入以上代码并按Enter,它将创建jni文件夹,并且其中将有标头文件
  7. 现在复制头文件并将其粘贴到同一文件夹中,但将.h替换为.cpp
  8. 从头文件中复制jni函数并将其粘贴到cpp文件中 enter image description here
  9. 如果显示错误,请构建它并转到gradle文件,然后编写 android.usedeprecatedndk=true
  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文件,并在默认配置之后放置以下内容

        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,则必须在命令行中提供该文件夹的位置,例如:C:/Users/do/AppData/Local/Android/sdk/ndk-bundle

  13. 现在构建它,它将创建jnilibs文件夹,其中包含您的libs文件

  14. 现在转到您的mainjava文件并加载此内容

静态代码块 { System.loadLibrary("MyLibs"); }
要调用您的本地代码,请编写 NativeClass.getMessageFromJNI() 并在文本视图中显示 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接