在 Android Studio 中使用 JNI

Android Studio 是 Google 官方推出的 Android 集成开发环境,目的是取代老旧的 Eclipse。最新的 ADT 发布于 2014.07.02,之后再也没有更新。作为客户端开发,跟进新开发工具是必须的。

Android Studio 从 1.3 开始支持 jni,在 Studio 中使用 jin有两种情况:

  1. 使用 Android Studio 的 gradle 自动编译 jni 的 c/c++ 代码。
  2. 使用已编译好的 *.so 库。

个人使用情况多为第二种,本文只介绍第二种情况的使用方法。

注:图中以 Android Studio 1.5 新建的工程为例,早起版本可能略有不同。

使用 Android Studio 新建工程

在 Android Studio 中创建项目仅需三步:

  1. File -> New -> New Projectm,弹出新建项目对话框,填入程序名称、公司域名、项目路径等信息。如下图所示:
    new_project.png
  2. 接下来选择SDK,这里我们选择Phone SDK的 2.3.3 版本(API 10)
    select_sdk.png
  3. 最后添加一个 Activity。作为测试,一个空的 Activity 就够用了。
    add_activity.png

项目创建完,可以插上手机,点击工具栏的播放按钮进行联机运行。

play.png

设备选择界面点击ok。

select_device.png

整个过程很流畅,没有卡顿,亲儿子确实比 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的解构了:

studiojni.png

测试 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窗口中看到如下信息:

logcat.png

可以看到 N9200 的 cpu 是 64位的。

demo下载地址:AndroidStudioWithJNI.zip

标签: Android, NDK

添加新评论