android studio ndk开发遇到的问题

来源:互联网 发布:福建广电网络电视客服 编辑:程序博客网 时间:2024/05/17 03:07

我用的是android studio 1.5的版本,所以gradle配置相比旧版本有了不少变化。可参考如下文档

http://tools.android.com/tech-docs/new-build-system/gradle-experimental

首先贴出我的完整gradle配置,让大家有个直观认识

apply plugin: 'com.android.model.application'model{    android {        compileSdkVersion = 19        buildToolsVersion = "22.0.1"        defaultConfig.with {            applicationId = "com.example.testhook"            minSdkVersion.apiLevel = 10            targetSdkVersion.apiLevel = 19            versionCode = 1            versionName = "1.0"        }    }    android.packagingOptions {        pickFirst 'lib/armeabi-v7a/libtest.so'        pickFirst 'lib/x86/libtest.so'    }    android.buildTypes {        release {            minifyEnabled = false            proguardFiles += file('proguard-rules.pro')            ndk.with {                CFlags += ["-O3"]                cppFlags += ["-DNDEBUG", "-O3"]            }        }    }    android.ndk {        moduleName = "test"        toolchain = "gcc"        toolchainVersion = "4.9"        cppFlags += ["-DPLATFORM_SDK_VERSION=14", "-DHAVE_LITTLE_ENDIAN", "-D__ARM_ARCH_7__"]        ldLibs += ["cutils","utils", "binder", "android_runtime", "dvm", "stlport", "dl"]        abiFilters += ["x86"]        abiFilters += ["armeabi-v7a"]        def android_branch = "android-2.3.3_r1.1";        ldFlags += "-L${getRootDir()}/dexposed-AOSP/${android_branch}/jniLibs/x86".toString()        ldFlags += "-L${getRootDir()}/dexposed-AOSP/${android_branch}/jniLibs/armeabi-v7a".toString()        Properties properties = new Properties()        properties.load(project.rootProject.file('local.properties').newDataInputStream())        def ndkDir = properties.getProperty('ndk.dir')        cppFlags  += "-I${ndkDir}/sources/cxx-stl/stlport/stlport".toString()        cppFlags  += "-I${getRootDir()}/dexposed-AOSP/${android_branch}/include/dalvik".toString()        cppFlags  += "-I${getRootDir()}/dexposed-AOSP/${android_branch}/include/dalvik/vm".toString()        cppFlags  += "-I${getRootDir()}/dexposed-AOSP/${android_branch}/include/external/stlport/stlport".toString()        cppFlags  += "-I${getRootDir()}/dexposed-AOSP/${android_branch}/include/bionic".toString()        cppFlags  += "-I${getRootDir()}/dexposed-AOSP/${android_branch}/include/bionic/libstdc++/include".toString()        cppFlags  += "-I${getRootDir()}/dexposed-AOSP/${android_branch}/include/system/core/include".toString()        cppFlags  += "-I${getRootDir()}/dexposed-AOSP/${android_branch}/include/frameworks/native/include".toString()        cppFlags  += "-I${getRootDir()}/dexposed-AOSP/${android_branch}/include/frameworks/base/include".toString()        cppFlags  += "-I${getRootDir()}/dexposed-AOSP/${android_branch}/include/libnativehelper/include".toString()    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    compile files('libs/commons-lang3-3.4.jar')}

有几点需要注意:

一、如果这是个library,则第一行应改为
apply plugin: ‘com.android.model.library’

二、框架整体的build.gradle中要改成如下
classpath ‘com.android.tools.build:gradle-experimental:0.2.0’

三、gradle-wrapper.properties里要改成gradle-2.5,如下
distributionUrl=https://services.gradle.org/distributions/gradle-2.5-all.zip

四、编译cpp时提示以下错误,而在c中就没有这个问题
java.lang.UnsatisfiedLinkError: Native method not found

解决办法,在函数前面加上extern “C”,如下

extern "C" JNIEXPORT JNICALL jstringJava_com_example_testhook_Tester_getName(JNIEnv *env, jclass object) {    return env->NewStringUTF("hello world!");}

五、接下来,最重要的是,如果我需要引用到android内核框架中的某些功能,该怎么做呢?

首先要引用android内核中对应模块的so文件,然后包含其头文件并一起编译。而要得到内核模块的so文件,需要先下载并编译android内核。而引用so和头文件都是在gradle中配置的,分别对应的是ldFlags和cppFlags。注意,如果是C文件,则为CFlags,否则会提示找不到头文件。

0 0