1.环境配置
(温馨提示,图片看不清楚的,可以点击鼠标右键,在新选项卡中查看图片^^)
1)打开studio建立新的工程,打开如下位置,下载红线所示的ndk及LLDB工具。
2)如下所示对ndk进行设置
3)替换掉原来的gradle工具,如图注释掉上面的,加入下面的代码。
4)修改app下面的gradle文件
给出完整代码,仔细辨别
apply plugin: 'com.android.model.application'
model { //这一行是新加的,对应上边的修改,
/**
* 这里要注意一下,如果使用gradle-experimental,参数赋值要使用 = 号,而不是空格,
* 所以要把原来文件中的空格都用等号去替换;
* 还有一部分参数使用的函数也与原来不一样,
* 实在不能确定的就找出ndk samples中的build.gradle文件对比一下。
*/
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig {
applicationId = "com.ndk.zhang"
minSdkVersion.apiLevel = 10 //这两个参数和原来有点不一样,多了apiLevel
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
ndk { //NDK设置
moduleName = "test" //动态库的名称
toolchain = 'clang' //编译器,据说这个比gcc要快,没有这个写native代码时没有自动补全的功能
CFlags.addAll(['-Wall', '-DHELLO_2']) //对应gcc中的编译选项 CFLAGS,方括号内是一个数组,可以有多个值
CFlags.add("-DHELLO_3")
// CFlags += "-DHELLO" //这种方式在这里行不通,包括以下的ldFlags, ldLibs 也一样.
ldFlags.addAll(["-L../lib"]) //库文件路径
ldLibs.addAll(['log']) //库文件名
stl = "stlport_static" //指示使用动态库还是静态库
}
buildTypes {
release {
minifyEnabled = true
proguardFiles.add(file('proguard-rules.pro')) //这是把原来的改成这样的
}
debug {
ndk.debuggable = true //有这个才会支持调试native 代码,这个放到release里一样能用
}
}
productFlavors { /** copy过来的,根据不同的平台,会有不同的配置 */
// for detailed abiFilter descriptions, refer to "Supported ABIs" @
// https://developer.android.com/ndk/guides/abis.html#sa
create("arm") {
ndk.abiFilters.add("armeabi")
}
create("arm7") {
ndk.abiFilters.add("armeabi-v7a")
}
create("arm8") {
ndk.abiFilters.add("arm64-v8a")
}
create("x86") {
ndk.abiFilters.add("x86")
}
create("x86-64") {
ndk.abiFilters.add("x86_64")
}
create("mips") {
ndk.abiFilters.add("mips")
}
create("mips-64") {
ndk.abiFilters.add("mips64")
}
// To include all cpu architectures, leaves abiFilters empty
// create("all")
}
}
} //这个是对就 model{
//android {
// compileSdkVersion 23
// buildToolsVersion "23.0.2"
//
// defaultConfig {
// applicationId "com.ndk.zhang"
// minSdkVersion 10
// targetSdkVersion 23
// versionCode 1
// versionName "1.0"
// }
// buildTypes {
// release {
// minifyEnabled false
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// }
// }
//}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}
5)好了,开发环境搞定了,下面开始写jni。新建java文件,如图:
完整代码
public class Test {
static {
System.loadLibrary("test");
}
public native void test();
}
7)这个时候Test.java文件是提示错误的,alt+enter出现如下效果
8)点击这个Create function ...即可生成.c文件在jni文件夹。打开c文件输入代码,结果如图
完整代码
#include <jni.h>
#include "android/log.h"
JNIEXPORT void JNICALL
Java_com_ndk_zhang_Test_test(JNIEnv *env, jobject instance) {
__android_log_write(ANDROID_LOG_ERROR,"TAG","TEST");
}
javah -d ../jni -jni com.ndk.zhang.Test即可生成.h文件,如图
10)debug起来,如果出现如下log说明成功了
11)如果想进行调试,很简单。选择app-native,然后在c文件中打断点就可以进行调试了。注意,如果出现手机卡在debug页面不动的情况,可以点击sudio的Run->attach debugger to android process就可以了。
其它问题慢慢补充,有问题可以留言。
补充
1.发现生成.so文件找不到,网上说到build->intermediates->ndk查找,但是死活找不到,后来发现在build->intermediates->binaries文件下面。
2.生成so文件方法,rebuild project是一种,其实只要跑完debug模式就会有debug版本的so生成,如果进行apk打包操作就会有release版本生成。
3.补充个app下面gradle文件的配置信息。注释部分删除掉无影响。而且很多语句也没用上所以也注释掉了。
apply plugin: 'com.android.model.application'
model { //这一行是新加的,对应上边的修改,
/**
* 这里要注意一下,如果使用gradle-experimental,参数赋值要使用 = 号,而不是空格,
* 所以要把原来文件中的空格都用等号去替换;
* 还有一部分参数使用的函数也与原来不一样,
* 实在不能确定的就找出ndk samples中的build.gradle文件对比一下。
*/
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig {
applicationId = "com.ndk.zhang"
minSdkVersion.apiLevel = 10 //这两个参数和原来有点不一样,多了apiLevel
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
ndk { //NDK设置
moduleName = "test" //动态库的名称
toolchain = 'clang' //编译器,据说这个比gcc要快,没有这个写native代码时没有自动补全的功能
// CFlags.addAll(['-Wall', '-DHELLO_2']) //对应gcc中的编译选项 CFLAGS,方括号内是一个数组,可以有多个值
// CFlags.add("-DHELLO_3")
// // CFlags += "-DHELLO" //这种方式在这里行不通,包括以下的ldFlags, ldLibs 也一样.
// ldFlags.addAll(["-L../lib"]) //库文件路径
ldLibs.addAll(['log']) //库文件名
// stl = "stlport_static" //指示使用动态库还是静态库
}
buildTypes {
release {
minifyEnabled = true
proguardFiles.add(file('proguard-rules.pro')) //这是把原来的改成这样的
}
debug {
ndk.debuggable = true //有这个才会支持调试native 代码,这个放到release里一样能用
}
}
productFlavors { /** copy过来的,根据不同的平台,会有不同的配置 */
create("all"){
}
}
}
}
4.针对生成so文件的问题说一下,如果根据补充中2,3步都生成不成功,建议利用补充中第3步文件进行替换,因为我是再改成3中代码后找到的so文件,目前也不清楚是gradle文件导致的,还是我开始没仔细看所以没找到,这里不再测试,知道的同学麻烦留言告知一下。这里主要补充一个proguard说明,针对那些对Proguard不熟悉的同学,请在你的Proguard文件中加上如下代码,此代码是为了防止你打包的时候被混淆,最后报错。
-keepclasseswithmembers,allowshrinking class * {
native <methods>;
}
5.爱看英文的给个官方网址,搭建方式跟这个一样http://tools.android.com/tech-docs/new-build-system/gradle-experimental。