简体   繁体   English

在 Android Studio (OpenCV) 中使用 NDK

[英]Use NDK in Android Studio (OpenCV)

I am trying to setup OpenCV in Android Studio, using NDK.我正在尝试使用 NDK 在 Android Studio 中设置 OpenCV。 The steps I have followed are:我遵循的步骤是:

  1. Create a library project for OpenCV and import it in MyProject .OpenCV创建一个库项目并将其导入MyProject
  2. Add all OpenCV library files to the /jni folder.将所有 OpenCV库文件添加到/jni文件夹。
  3. Create Android.mk file创建Android.mk文件

However, when I run the Android.mk with ndk-build I get this error:但是,当我使用ndk-build运行 Android.mk 时,出现此错误:

Nothing to be done for `.../MyProject/jni/Android.mk'.

This is the content of Android.mk:这是Android.mk的内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

include /.../MyProject/jni/OpenCV.mk

I am stuck at building the libraries, any help?我被困在建立图书馆,有什么帮助吗?


SOLUTION解决方案

I managed to use NDK by linking gradle to an external installation of it, and by also using javah to created implementation headers for native methods.我设法通过将 gradle 链接到它的外部安装来使用 NDK,并且还使用javah为本机方法创建实现标头。 Follow these steps to setup Gradle to use NDK:按照以下步骤设置 Gradle 以使用 NDK:

  • install ndk (it's not built into Android Studio, so it needs to be installed manually)安装ndk(它没有内置在 Android Studio 中,因此需要手动安装)

  • setup ndk.dir in local.properties and ndkDir in gradle.properties to link to installation path在 local.properties 中设置 ndk.dir 并在 gradle.properties 中设置 ndkDir 以链接到安装路径

  • create " jni " folder in src/main在 src/main 中创建“ jni ”文件夹

  • add Application.mk file to jniApplication.mk文件添加到 jni

    APP_ABI := armeabi APP_PLATFORM := android-9 APP_ABI := armeabi APP_PLATFORM := android-9

  • add Android.mk file to jni (change LOCAL_SRC_FILES and LOCAL_MODULE values)Android.mk文件添加到 jni(更改 LOCAL_SRC_FILES 和 LOCAL_MODULE 值)

    LOCAL_PATH := $(call my-dir) LOCAL_PATH := $(调用我的目录)

    include $(CLEAR_VARS)包括 $(CLEAR_VARS)

    LOCAL_SRC_FILES := main.c LOCAL_LDLIBS += -llog LOCAL_MODULE := hello LOCAL_SRC_FILES := main.c LOCAL_LDLIBS += -llog LOCAL_MODULE := 你好

    include $(BUILD_SHARED_LIBRARY)包括 $(BUILD_SHARED_LIBRARY)

  • add this code to gradle将此代码添加到gradle

     sourceSets.main.jni.srcDirs = [] // take the built .so files and place them in jniLibs //noinspection GroovyAssignabilityCheck task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') { commandLine "$ndkDir/ndk-build", '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 }
  • setup javah as External tool (point to your installation directory) Program: /usr/bin/javah Params: -v -jni -d $ModuleFileDir$/src/main/jni $FileClass$ Working dir: $SourcepathEntry$将 javah 设置为外部工具(指向您的安装目录)程序:/usr/bin/javah 参数:-v -jni -d $ModuleFileDir$/src/main/jni $FileClass$ 工作目录:$SourcepathEntry$

  • run javah on .java file containing native method -> header is created在包含本机方法的 .java 文件上运行 javah -> 创建标头

  • create implementation file创建实现文件

  • specifiy module in gradle:在 gradle 中指定模块:

     defaultConfig { minSdkVersion 9 targetSdkVersion 21 versionCode 4 versionName '1.11' ndk { moduleName "hello" } }
  • done!完毕!

I have posted a new post about how to build an Android NDK application with OpenCV included using Android Studio and Gradle.我发布了一篇关于如何使用包含 Android Studio 和 Gradle 的 OpenCV 构建 Android NDK 应用程序的新文章。 More information can be seen here , I have summarized two methods:更多信息可以看这里,我总结了两种方法:

(1) run ndk-build within Gradle task (1) 在 Gradle 任务中运行ndk-build

sourceSets.main.jni.srcDirs = []

task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
    ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
    commandLine "$ndkDir/ndk-build",
            '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
}

(2) run ndk-build with an external tool (2) 使用外部工具运行ndk-build

Parameters: NDK_PROJECT_PATH=$ModuleFileDir$/build/intermediates/ndk NDK_LIBS_OUT=$ModuleFileDir$/src/main/jniLibs NDK_APPLICATION_MK=$ModuleFileDir$/src/main/jni/Application.mk APP_BUILD_SCRIPT=$ModuleFileDir$/src/main/jni/Android.mk V=1参数: NDK_PROJECT_PATH=$ModuleFileDir$/build/intermediates/ndk NDK_LIBS_OUT=$ModuleFileDir$/src/main/jniLibs NDK_APPLICATION_MK=$ModuleFileDir$/src/main/jni/Application.mk APP_BUILD_SCRIPT=$ModuleFileDir$/src/main/jni/Android.mk V=1

More information can be seen here更多信息可以在这里看到

You cannot yet use Android Studio for NDK development, but you can add pre-built *.so files of Open CV in your project in the new version of Gradle 0.7.2+您还不能使用Android Studio进行NDK开发,但您可以在新版Gradle 0.7.2+的项目中添加Open CV的预构建*.so文件

Follow the steps here: How to use opencv in android studio using gradle build tool?按照这里的步骤操作: How to use opencv in android studio using gradle build tool?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM