在 Android Studio 中使用 JNI
Android Studio 是 Google 官方推出的 Android 集成开发环境,目的是取代老旧的 Eclipse。最新的 ADT 发布于 2014.07.02,之后再也没有更新。作为客户端开发,跟进新开发工具是必须的。
Android Studio 从 1.3 开始支持 jni,在 Studio 中使用 jin有两种情况:
- 使用 Android Studio 的 gradle 自动编译 jni 的 c/c++ 代码。
- 使用已编译好的 *.so 库。
个人使用情况多为第二种,本文只介绍第二种情况的使用方法。
注:图中以 Android Studio 1.5 新建的工程为例,早起版本可能略有不同。
使用 Android Studio 新建工程
在 Android Studio 中创建项目仅需三步:
- File -> New -> New Projectm,弹出新建项目对话框,填入程序名称、公司域名、项目路径等信息。如下图所示:
- 接下来选择SDK,这里我们选择Phone SDK的 2.3.3 版本(API 10)
- 最后添加一个 Activity。作为测试,一个空的 Activity 就够用了。
项目创建完,可以插上手机,点击工具栏的播放按钮进行联机运行。
设备选择界面点击ok。
整个过程很流畅,没有卡顿,亲儿子确实比 Eclipse 做得好多了。
jni 测试代码
最简单的jni测试代码莫过于 NDK 自带的 hello-jni 工程,首先把 hello-jni 下的 jni 目录拷贝到我们的项目: AndroidStudioWithJNI/app/jni
,拷贝到这个路径有利于我们后期在java工程中引用so库。
根据项目的不同,把函数名改为
jstring
Java_com_tyrantek_androidstudiowithjni_MainActivity_stringFromJNI( JNIEnv* env,
jobject thiz )
规则为Java + 包名 + Activity名 + 函数名
。
编译so库:
$ cd /Users/u0u0/Documents/project/AndroidStudio/AndroidStudioWithJNI/jni
$ ndk-build
注:请先在环境变量中配置 path ,加入 NDK 的路径,确保命令行可以访问到 ndk-build 命令。
编译完成可以在同级的 libs 中看到各平台的so库文件:
[app]
[libs]
[armeabi]
[armeabi-v7a]
[x86]
build.gradle 的修改
为了让so打包进入apk,需要修改app/build.gradle
文件,在 android 字段中加入下面的配置:
sourceSets.main {
jniLibs.srcDir 'libs'
}
jniLibs.srcDir 为开发者提供了很高的灵活性。
build.gradle的修改会触发 Studio 自动 sync机制,点击确认以开始sync,之后就会在Studio中看到一个jniLibs的解构了:
测试 Java 中调用 jni
修改 MainActivity.java,使用System.loadLibrary
加载库,并声明对应的方法。
注:libmylib.so 的加载,使用的是mylib
,也就是去掉前缀lib、去掉后缀.so。
public class MainActivity extends AppCompatActivity {
// Jni import and method define
static {
System.loadLibrary("mylib");
}
public native String stringFromJNI();
@Override
protected void onCreate(Bundle savedInstanceState) {
// call jni function
android.util.Log.v("AndroidStudioWithJni", stringFromJNI());
super.onCreate(savedInstanceState);
}
}
运行测试可以在logcat窗口中看到如下信息:
可以看到 N9200 的 cpu 是 64位的。
demo下载地址:AndroidStudioWithJNI.zip