Android studio1.5.1 NDK配置开发
注意:因为使用的工具和SDK版本不同,过程可能就不同,我把我试验过的几种情况都会说下。
一、工具和SDK版本:Android studio1.51, SDK版本:23 (最新的6.0)
二、工具和SDK版本:Android studio1.51, SDK版本:21
在这两种情况之前你必须做好一件事:安装NDK。过程如下:
在setting 中appearance -> Android SDK -> SDK Tools -> Android NDk 打钩,然后点击apply -> OK. 如下图:
自动安装好DN卡之后,会在local.properties 中有显示:如下图
到此ND就安装完成了,那么接下来就是关键时刻了,先来看看情况一的具体过程:
1. 新建一个工程,就是一个简单的空白工程,功能也没有
2. 定义native 接口 和 加载即将生成的库。就几行代码,代码如下:
- packagezhanghuan.cn.jnitest1;
- importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;
- importandroid.widget.TextView;
- publicclassMainActivityextendsAppCompatActivity{static{
- System.loadLibrary("JniTest");}
- publicnativeStringgetStringFromNative();
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- TextViewtextView=(TextView)findViewById(R.id.text);textView.setText(getStringFromNative());//调用接口
- }}
3. 写好接口之后接下来就是关键了,点击 Build -> Make Project, 如下图:然后在底部的状态栏Messages 中查看Build的情况,必须是0错误才行,如下图:
4. Build 成功之后,就在Terminal 命令行中开始生成.h 文件
命令为:
- javah-djni-classpathD:\tools\android-sdk\platforms\android-23\android.jar;D:\MyProject\AndroidStudio\JniTest1\app\src\main\javazhanghuan.cn.jnitest1.MainActivity
就是这一步卡了我好久,之前找的教程每个的命令都是这样的:
- javah-djni-classpathD:\tools\android-sdk\platforms\android.jar;..\..\build\intermediates\classes\debugzhanghuan.cn.jnitest1.MainActivity
结果报错 “找不到android.support.v7.app.AppCompatActivity的类文件” 如下图:
回归正题,命令成功之后,在main 目录下回生成jni目录,然后还有一个.h 文件:如下图:
我贴下.h 文件的代码:
- /*DONOTEDITTHISFILE-itismachinegenerated*/#include
- /*Headerforclasszhanghuan_cn_jnitest1_MainActivity*/
- #ifndef_Included_zhanghuan_cn_jnitest1_MainActivity#define_Included_zhanghuan_cn_jnitest1_MainActivity
- #ifdef__cplusplusextern"C"{
- #endif/*
- *Class:zhanghuan_cn_jnitest1_MainActivity*Method:getStringFromNative
- *Signature:()Ljava/lang/String;*/
- JNIEXPORTjstringJNICALLJava_zhanghuan_cn_jnitest1_MainActivity_getStringFromNative(JNIEnv*,jobject);
- #ifdef__cplusplus
- }#endif
- #endif 5. 复制.h 文件放在相同的目录下,改个名称(名字任意)为my.c , 代码如下:
- #include"zhanghuan_cn_jnitest1_MainActivity.h"
- JNIEXPORTjstringJNICALLJava_zhanghuan_cn_jnitest1_MainActivity_getStringFromNative(JNIEnv*env,jobjectjob){
- return(*env)->NewStringUTF(env,"HelloformJNI!");}
但是这时你会发现有错误,NDK support is an experimental feature and all use cases are not yet supported, 如下图:解决方法是在gradle.properties 文件中加入一句代码:
- android.useDeprecatedNdk=true
- ndk{moduleName"JniTest"
- abiFilters"armeabi","armeabi-v7a","x86"} 我的build.gradle 文件代码如下:
- applyplugin:'com.android.application'
- android{compileSdkVersion23
- buildToolsVersion"23.0.2"
- defaultConfig{applicationId"zhanghuan.cn.jnitest1"
- minSdkVersion11targetSdkVersion23
- versionCode1versionName"1.0"
- ndk{
- moduleName"JniTest"abiFilters"armeabi","armeabi-v7a","x86"
- }}
- buildTypes{release{
- minifyEnabledfalseproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
- }}
- }
- dependencies{compilefileTree(dir:'libs',include:['*.jar'])
- testCompile'junit:junit:4.12'compile'com.android.support:appcompat-v7:23.2.1'
- }
到此,基本步骤就全部完成了,然后就直接运行一下,看下效果,效果图如下:
成功完成!如果有兴趣可以看下下面的第二种情况。好了,接下来我们就看看第二种情况:不使用V7。
1. 前面的几步步骤和第一种情况是一样的,到第4步的命令行开始有重要的差别, 我就直接跳到命令行那步了,命令如下:
- javah-djni-classpathD:\tools\android-sdk\platforms\android-21\android.jar;D:\MyProject\AndroidStudio\JinTest\app\build\intermediates\classes\debugzhanghuan.cn.jintest.MainActivity
注意如果出错要写绝对的地址,网上的教程都是什么”..\..\buidl\...“这种写法,但是我一次都没成功,折腾了很久都没成功,如果你成功了就请告诉我。
最后生成的.h 文件代码如下:
- /*DONOTEDITTHISFILE-itismachinegenerated*/#include
- /*Headerforclasszhanghuan_cn_jintest_MainActivity*/
- #ifndef_Included_zhanghuan_cn_jintest_MainActivity#define_Included_zhanghuan_cn_jintest_MainActivity
- #ifdef__cplusplusextern"C"{
- #endif#undefzhanghuan_cn_jintest_MainActivity_BIND_ABOVE_CLIENT
- #definezhanghuan_cn_jintest_MainActivity_BIND_ABOVE_CLIENT8L#undefzhanghuan_cn_jintest_MainActivity_BIND_ADJUST_WITH_ACTIVITY
- #definezhanghuan_cn_jintest_MainActivity_BIND_ADJUST_WITH_ACTIVITY128L#undefzhanghuan_cn_jintest_MainActivity_BIND_ALLOW_OOM_MANAGEMENT
- #definezhanghuan_cn_jintest_MainActivity_BIND_ALLOW_OOM_MANAGEMENT16L#undefzhanghuan_cn_jintest_MainActivity_BIND_AUTO_CREATE
- #definezhanghuan_cn_jintest_MainActivity_BIND_AUTO_CREATE1L#undefzhanghuan_cn_jintest_MainActivity_BIND_DEBUG_UNBIND
- #definezhanghuan_cn_jintest_MainActivity_BIND_DEBUG_UNBIND2L#undefzhanghuan_cn_jintest_MainActivity_BIND_IMPORTANT
- #definezhanghuan_cn_jintest_MainActivity_BIND_IMPORTANT64L#undefzhanghuan_cn_jintest_MainActivity_BIND_NOT_FOREGROUND
- #definezhanghuan_cn_jintest_MainActivity