当前位置:  开发笔记 > 编程语言 > 正文

使用Gradle和Android Studio的Android库项目中的NDK Dev

如何解决《使用Gradle和AndroidStudio的Android库项目中的NDKDev》经验,为你挑选了1个好方法。

我一直试图破解使用JNI的Gradle托管的Android项目,我遇到了一些麻烦.我知道NDK支持仍然是相对较新的,并且大部分都没有记录,但是我已经设法找到了将它变成Gradle构建的基本元素.显然,诀窍是将所有本机代码包含src/main/jni在其中一个配置中(例如在defaultConfig块中):

ndk {
    moduleName "mylib"
}

问题是当我尝试构建我的项目时,ndk插件会生成一个Android.mk文件,其中包含本机源的绝对路径.这导致make窒息,因为它仍然认为路径是相对的.在我的情况下,我有一个简单的库项目,下面有1个cpp源/头组合src/main/jni,我用它gradle.build:

apply plugin: 'android-library'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
        ndk {
            moduleName "mylib"
        }
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'
}

运行构建会在build/ndk/debug下生成此Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := mylib
LOCAL_SRC_FILES := \
    /Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/Android.mk \
    /Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.cpp \

LOCAL_C_INCLUDES += /Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni
LOCAL_C_INCLUDES += /Users/clifton/dev/Multi/MultiAndroid/lib/src/debug/jni

include $(BUILD_SHARED_LIBRARY)

...运行时会产生此错误:

make: *** No rule to make target `/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug//Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.cpp', needed by `/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug/obj/local/armeabi-v7a/objs/mylib//Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.o'.  Stop.

...因为绝对路径被错误地转换为相对路径.如果我手动编辑文件并将路径更改为相对,如下所示:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := mylib
LOCAL_SRC_FILES := \
    ../../../src/main/jni/Android.mk \
    ../../../src/main/jni/myNativeSectionTextProvider.cpp \

LOCAL_C_INCLUDES += ../../../src/main/jni
LOCAL_C_INCLUDES += ../../../src/debug/jni

include $(BUILD_SHARED_LIBRARY)

...然后我得到这个错误:

/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug/../../../src/main/jni/com_craig_multiandroid_app_NativeSectionTextProvider.h:2:17: fatal error: jni.h: No such file or directory

我的问题是我该怎么做才能解决这个问题?我开始破解我自己的.aar构建的自定义gradle支持,但是试图弄清楚哪个Gradle任务负责生成.aar文件.(Gradle文档,虽然很多,但很难找到特定Android Gradle任务API的详细信息.)我有一个部分工作的gradle.build,它将通过cmd行运行ndk-build,生成.so但我可以'弄清楚如何(或者即使我应该)内联.aar中的.so.我使用的是Android Studio 0.5.7和Gradle 1.11.几个月前我已经删除了Gradle源代码,这就是我如何在常规.apk项目中内联.so和gdbserver文件,但这些规则似乎不适用于.aar项目.有没有其他人尝试过这个?我在哪里可以找到答案?



1> Cliff..:

我终于明白了!您必须使用最新的NDK来获得较新的Gradle NDK支持.我的local.properties(和我的〜/ .bashrc)指向android-ndk-r8e来解决android-ndk-r9d中破坏的gdb-server支持但是当我更新到android-ndk-r9d时我的gradle构建开始工作了没有额外的黑客.总而言之,只要您的local.properties指向NDK的版本9b +,上述示例就可以工作.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有