感谢 “Sodino” 大神的无私分享!
这是他的博客地址:http://blog.csdn.net/sodino/article/details/41946607感谢 “穷小子” 大神的无私分享!
这是他的博客地址:http://blog.csdn.net/tuoguang/article/details/48141251
不劳而获的喜悦,走向毁灭。
在AndroidStudio中集成开发NDK的步骤
在Eclipse中,需要配置很多东西,手动下载NDK,下载UNIX/Linux模拟环境cygwin等等很多的东西,很麻烦;
但是在AndroidStudio中可以大大简化繁琐的步骤。
我的AndroidStudio版本是1.5.1,推荐使用1.3以上版本。
1.NDK环境配置
1.1. 下载NDK
点击File—>Settings—>Appearance&Behavior—>System Settings—>Android SDK—>SDK Tools
下载NDK开发工具包
2.2. 配置NDK路径
点击File—>Project Structure
配置NDK路径,NDK默认目录是sdk目录下的ndk-bundle
在local.properties文件中查看是否配置成功
2.3. 修改gradle.properties配置
之前是没有修改这条的,会出现很多错误
Error:Execution failed for task ‘:app:compileDebugNdk’.
Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set “android.useDeprecatedNdk=true” in gradle.properties to continue using the current NDK integration.
在gradle.properties文件里加上android.useDeprecatedNdk=true
这句话,就行了
2.Demo程序
2.1 生成.h头文件
因为在Android中,头文件必须严格遵循jni的命名规则,所以我们使用javah自动生成我们需要的头文件
新建一个Android工程
添加native接口
public class MainActivity extends Activity {
//静态,添加native接口
static {
System.loadLibrary("JniTest");
}
public native String getStringFromNative();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(getStringFromNative());
}
}
这时候getStringFromNative方法是红的,因为我们还没有建立jni文件夹和c库(截图不是红的是因为我之后补截了一个)
点击Build—>Make Project编译,生成.class文件
点击view—>Tool Windows—>Terminal,打开控制台
默认进入到的是当前工程的目录,输入命令:cd app\src\main,切换到main目录下
输入javah -d jni -classpath C:\Android\sdk\platforms\android-22\android.jar;….\build\intermediates\classes\debug com.waka.workspace.ndkdemo.MainActivity
提示:命令行意义解析
javah是生成头文件需要的工具
-d jni 在工程下生成jni目录,会在这里放c/c++文件
-classpath C:\Android\sdk\platforms\android-22\android.jar 是sdk文件夹下android.jar所在的文件位置,可以配置到环境变量中快速调用,这里注意要用分号”;”和后面区分开
..\..\build\intermediates\classes\debug 指向debug目录,注意和后面用空格” “区分开
com.waka.workspace.ndkdemo.MainActivity 需要调用ndk的类
注意:不要继承AppCompatActivity,会报错
改为继承Activity,Make Project重新编译,生成.class文件;
再次输入javah -d jni -classpath C:\Android\sdk\platforms\android-22\android.jar;….\build\intermediates\classes\debug com.waka.workspace.ndkdemo.MainActivity
生成头文件成功
可以看到项目里出现了jni文件夹和.h头文件
2.2 在jni目录下建立C源文件
生成了两个文件main.c和main.h
把main.h删了,main.c里改为#include "com_waka_workspace_ndkdemo_MainActivity.h"
,并实现头文件中的方法
JNIEXPORT jstring JNICALL
Java_com_waka_workspace_ndkdemo_MainActivity_getStringFromNative
(JNIEnv *env, jobject obj) {
return (*env)->NewStringUTF(env, "Hello From JNI!");
}
2.3 修改build.gradle配置
工程中共有两个build.gradle配置文件,我们修改Project\app\build.gradle这个文件
在defaultConfig分支中加上
ndk {
moduleName "JniTest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
以上配置代码指定的so库名称为JniTest,链接时用到的库,对应android.mk文件中的LOCAL_LDLIBS,及最终输出指定三种abi体系结构下的so库
Android Studio不用配置android.mk文件,但是不用配置不代表他没有,只不过配置过程不用我们来做,我们使用gradle就可以自动生成了
那android.mk在哪呢?
点击Build—>Make Project重新编译,即可找到android.mk文件
这时候运行程序,已经可以看到成功了