android studio ndk开发遇到的问题

我用的是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 jstring
Java_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,否则会提示找不到头文件。

你可能感兴趣的:(android,android,gradle,NDK,Studio)