您的位置:首页 > 移动开发 > Android开发

[Android] AndroidStudio + JNI(NDK)开发相关总结

2017-05-23 17:13 489 查看
1、官方推荐JNI构建方案

从Android studio 2.2 开始,Google推荐的JNI开发构建工具是CMake而不是NDK,参考官方文档:https://developer.android.com/studio/projects/add-native-code.html

但是,我们要求使用NDK-r9d,是不支持CMake构建的,会报错提示找不到make工具等。

关于Gradle插件NDK相关的用法,参考官方文档:http://tools.android.com/tech-docs/new-build-system/gradle-experimental

2、JNI构建过程

基本流程是:(1)在AS中配置好NDK路径;(2)创建Java工程,然后写一个Java类中声明Native方法;(3)编译一下Java类生成class;(4)用javah -d ../jni com.example.kuliuheng.myapplication.TestClass 就能自动生成native方法对应的C++头文件;(5)就在jni目录下去添加cpp文件或者c文件去实现;(6)如果用Gradle自动编译,那么在android.defaultConfig下添加一个ndk模块就可以了,写一个moduleName就行。

3、新的NDK工程构建方法

  上面描述的是AndroidStudio自带的NDK工程构建步骤,这里描述一种利用Experimental plugin 很方便地构建NDK工程的方法。在此之前,先搞清楚几个名词的关系:

3.1 Gradle 与 Android Plugin(for Gradle)

  首先来看下一个默认工程中这两者的关系:

buildscript {
repositories {
jcenter()
}
dependencies {
//        classpath 'com.android.tools.build:gradle:2.1.3'
classpath 'com.android.tools.build:gradle-experimental:0.8.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
apply plugin: 'com.android.model.application'

model {
android {
compileSdkVersion = 23
buildToolsVersion = '23.0.3'

defaultConfig {
applicationId "com.gala.uniplayer.androiddemotest"
minSdkVersion.apiLevel 14
targetSdkVersion.apiLevel 24
versionCode 1
versionName "1.0"
multiDexEnabled true
}

buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file("proguard-rules.pro"))
}
}

ndk {
platformVersion 19
moduleName "galauniplayersdkjni"
CFlags.add("")
cppFlags.addAll(["-std=c++11", "-frtti"])
cppFlags.addAll(['-I' + file('../../../../../uniplayersdk-pub/include/uniplayersdk'),
'-I' + file('../../../../../qyuniutil-pub/include'),
'-I' + file('src/main/cpp/include'),
])

abiFilters.add("armeabi")
CFlags.add("-DCUSTOM_DEFINE")
cppFlags.add("-DCUSTOM_DEFINE")

File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + '/src/main/libs/armeabi'
String rootPath = curDir.absolutePath +"/../../../../../"

ldFlags.add("-L" + libsDir)
ldFlags.add("-L" + rootPath+"qyuniutil-pub/libs/android/armeabi")
ldFlags.add("-L" + rootPath+"uniplayersdk-pub/libs/android/armeabi")

ldLibs.add("mcto_media_player")
ldLibs.add("galauniutil")
ldLibs.add("galauniplayersdk")

stl "gnustl_shared"
}

sources {
main {
java {
source {
srcDir "src/main/java"
}
}
jni {
source {
srcDir "src/main/cpp"
}
}
jniLibs {
source {
srcDir "src/main/libs"
}
}
}
}
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'src/main/libs')
compile files('src/main/libs/cupid_app_interface.jar')
compile files('src/main/libs/nativemediaplayersdk.jar')
compile files('src/main/libs/galauniplayersdk.jar')
//    compile project(':uniplayer_lib')
}

task copySoTask(type: Copy) {
from('../../../../../thirdparty-libs/libs/android/tvjson/shared/') {
include 'armeabi/*.so'
}
from('../../../../../thirdparty-libs/libs/android/puma_tv/shared/') {
include 'armeabi/*.so'
}
from('../../../../../thirdparty-libs/libs/android/puma_tv/jar/') {
include '*.jar'
}
from('../../../../../uniplayerdata-pub/libs/android/') {
include 'armeabi/*.so'
}
from('../../../../../uniplayersdk-pub/libs/android/') {
include 'armeabi/*.so'
}
from('../../../../../uniplayersdk-pub/libs/android/') {
include 'galauniplayersdk.jar'
}
from('../../../../../qyuniutil-pub/libs/android/') {
include 'armeabi/*.so'
}
into 'src/main/libs'
}

tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn copySoTask
}


View Code
  使用了这个插件之后带来语法上的变化主要有以下几点:

Plugin name is com.android.model.application instead of com.android.application. Or use apply plugin: “com.android.model.library” if you want to create an Android aar library.
使用com.android.model.application代替com.android.application; [b]使用com.android.model.library代替com.android.library[/b]

Configuration is wrapped with the model { } block
所有的配置需要使用model{}包含起来

Adding elements to a Collection should be done using the add method.
向集合添加元素时,需要使用add方法





  上图是官方文档给出来的需要变更语法的地方。

<4> 官方文档很重要

  好多NDK配置特性都能找到:http://tools.android.com/tech-docs/new-build-system/gradle-experimental

  一个歪果大牛写的入门Blog:https://ph0b.com/new-android-studio-ndk-support/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: