Android Studio JNI

Android Studio通过jni调用又C/C++构建的方法的过程。用到的Android Studio的版本是2.3,NDK版本是14.0.3770861,buildToolsVersion是25.0.2。gradle版本是2.3.0。

  1. 下载NDK,并配置NDK的环境变量,将ndk-bundle的目录添加进path。
  2. 新建项目,创建的项目为JniDemo
  3. 在main目录下创建jni文件夹,如图:
    jni_1
  4. 接下来创建HelloJni.java文件,并创建native方法:sayHello。如图:
    jni_2
    jni_3
  5. 在build.gradle中设置ndk的moduleName,如图:
    jni_4
    然后在gradle.properties中添加:android.useDeprecatedNdk=true
  6. 生成头文件

    1. 可以通过javah命令生成头文件。在使用javah命令之前,先build一遍项目,执行:build–>rebuild project。此时在app–build–intermediates中会生成classes文件夹。
    2. 打开terminal,定位到app文件夹下,执行命令:

      1
      javah -d src/main/jni/ -classpath build/intermediates/classes/debug/ com.phoenix.jnidemo.HelloJni

      其中,-d是生成头文件的位置,-classpath是class文件的位置。如图:
      jni_5
      然后就会在jni目录下生成头文件。

    3. 生成c文件,在jni目录中,新建com_phoenix_jnidemo_HelloJni.c文件,实现sayHello方法。
      1
      2
      3
      4
      5
      6
      7
      #include "com_phoenix_jnidemo_HelloJni.h"
      JNIEXPORT jstring JNICALL
      Java_com_phoenix_jnidemo_HelloJni_sayHello(JNIEnv *env, jobject obj)
      {
      return (*env)->NewStringUTF(env, "Hello Jni");
      }
  1. 通过ndk生成so文件

    1. 在jni目录中编写Application.mk文件

      1
      2
      APP_MODULES := hello
      APP_ABI := all
    2. 编写Android.mk文件

      1
      2
      3
      4
      5
      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      LOCAL_MODULE := hello
      LOCAL_SRC_FILES =: sayHello.c
      include $(BUILD_SHARED_LIBRARY)
    3. 在terminal中切换到jni目录下,执行ndk-build命令,然后就会生成so文件。

  2. 此时项目构建完成,可以在build.gradle中指定so文件的位置,如图:
    jni_6
    如果不指定so文件的位置,可以在在main目录下创建jniLibs文件夹,然后把libs文件夹中生成的文件复制到jniLibs下,jniLibs文件夹是默认的so文件的存放目录。
  3. 调用C的方法,通过静态代码块加载so库。
    1
    2
    3
    static {
    System.loadLibrary("hello");
    }

如图: jni_7

项目地址

https://github.com/PhoenixGJH/JniDemo

参考文章

  1. https://juejin.im/post/58d83bf40ce46300570bc3c9
  2. http://blog.csdn.net/conowen/article/details/7523145/