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 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,否则会提示找不到头文件。
更多相关文章
- 64位Ubuntu Kylin14编译android内核
- Android 使用FTP上传文件
- Android将需要的日志文件LOG记录到本地文件夹下指定的文件
- android 调用第三方软件打开pdf文件
- Android 文件读写的例子