[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)
首先来看下一个默认工程中这两者的关系:
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/
从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/
相关文章推荐
- AndroidStudio集成ndk、开发JNI
- android 开发ndk相关总结
- Android Studio jni的开发与ndk的配置
- Android Studio NDK/JNI开发
- 第十篇:ndk项目实战之Androidstudio开发经验总结
- Android Studio NDK-Jni开发小Demo
- Android Studio JNI开发(2)------NDK 编译原生库
- AndroidStudio2.2中NDK开发之CMake和传统 JNI在目录结构和配置文件上的区别
- Android Studio JNI/NDK 编程 Windows 下环境搭建 demo 开发
- NDK探究之旅《十》——ndk项目实战之Androidstudio开发经验总结
- Android JNI(NDK)开发总结
- Android JNI(NDK)开发总结
- Android Studio ndk开发相关注意事项
- AndroidStudio NDK开发 之 jni生成so文件
- Android Studio NDK开发 正确调用jni 及加入第三方so库需要注意的问题
- Android Studio ndk-Jni开发详细入门,Aes加密demo
- Android Studio NDK jni 开发生成头文件和加载so库
- Android Studio NDK JNI开发入门记录
- JNI开发之HelloWorld(Android Studio+ndk-bundle)
- AndroidStudio2.2.3 JNI与NDK开发之一:生成可调用.so库