【问题标题】:Android.mk and Application.mk to build OpenCV 3.2Android.mk 和 Application.mk 构建 OpenCV 3.2
【发布时间】:2017-05-24 05:42:47
【问题描述】:
我已经下载了OpenCV for Android 版本 3.2 并将其 java 模块导入我的项目。我已将本机 (c++) 代码复制到 openCVLibrary320/app/src/main/jni 的模块目录中。
如何创建 Application.mk 和 Android.mk 来编译这个 sdk? (据我所知,ndk-build 需要这两个文件)
【问题讨论】:
标签:
android
opencv
android-studio
android-ndk
【解决方案1】:
如果你想为 OpenCV 使用Java API,那么你可以看看这个post。
但是,如果您想在 NDK 端使用带有 C/C++ 代码的预构建 OpenCV 静态库,那么只有您需要 Android.mk 和 Application.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)
应用程序.mk
APP_STL := gnustl_static
APP_CPPFLAGS += -fexceptions -frtti -std=c++11 -D__STDC_CONSTANT_MACROS
APP_ABI := all
APP_PLATFORM=android-14
【解决方案2】:
很容易按照我的所有点来做,
- 导入你的 Opencv(就像你已经做过的那样)
- 现在转到您的项目结构选择应用程序而不是添加新依赖项并选择您的 opencv 模块点击确定
- 创建一个名为 NativeClass.java 的类,它将包含您的本机函数和变量
- 在您的 nativeClass.java 中从 JNI 创建一个 getMessage 方法并构建它
-
现在打开终端并写这个
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
- 当你在终端输入上面的代码时,点击进入它会创建jni文件夹,它会有头文件
- 现在复制头文件并将其粘贴到同一文件夹中,但写入 .cpp 而不是 .h
- 从头文件中复制函数 jni 函数并将其复制到 cpp 文件中
- 构建如果显示错误转到 gradle 文件并写入
android.usedeprecatedndk=true
-
现在在您的 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)
-
现在创建 Application.mk 文件并编写此代码
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-16
-
现在转到您的 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,则必须像这样 C:/Users/do/AppData/Local/Android/sdk/ndk-bundle 在 common 行中提供该文件夹位置>
现在构建它将创建 jnilibs fodler,它将包含您的 libs 文件
现在转到您的 mainjava 文件并加载它
静态{
System.loadLibrary("MyLibs");
}
- 调用您的本机代码编写 NativeClass.getMessageFromJNI()
并在文本视图中显示
【解决方案3】:
虽然您已经为 ndk-build 请求了 Android.mk,但我想建议 CMake,Android Developers 建议将其用于原生项目。
在这种情况下,您可以查看my answer,它提供了两种将 OpenCV 3.2.0 SDK 集成到 Android 项目/应用程序中的解决方案。该实现提供了适当且经过测试的集成,它利用 OpenCV SDK 中的CMakeLists.txt 脚本来正确构建和链接库模块(包括第 3 方和 SDK 库),它还包括在本机 C 中编码的头文件/C++ 类是项目的一部分。