Android Studio通过jni调用又C/C++构建的方法的过程。用到的Android Studio的版本是2.3,NDK版本是14.0.3770861,buildToolsVersion是25.0.2。gradle版本是2.3.0。
- 下载NDK,并配置NDK的环境变量,将ndk-bundle的目录添加进path。
- 新建项目,创建的项目为JniDemo
- 在main目录下创建jni文件夹,如图:
- 接下来创建HelloJni.java文件,并创建native方法:sayHello。如图:
- 在build.gradle中设置ndk的moduleName,如图:
然后在gradle.properties中添加:android.useDeprecatedNdk=true 生成头文件
- 可以通过javah命令生成头文件。在使用javah命令之前,先build一遍项目,执行:build–>rebuild project。此时在app–build–intermediates中会生成classes文件夹。
打开terminal,定位到app文件夹下,执行命令:
1javah -d src/main/jni/ -classpath build/intermediates/classes/debug/ com.phoenix.jnidemo.HelloJni其中,-d是生成头文件的位置,-classpath是class文件的位置。如图:
然后就会在jni目录下生成头文件。- 生成c文件,在jni目录中,新建com_phoenix_jnidemo_HelloJni.c文件,实现sayHello方法。1234567#include "com_phoenix_jnidemo_HelloJni.h"JNIEXPORT jstring JNICALLJava_com_phoenix_jnidemo_HelloJni_sayHello(JNIEnv *env, jobject obj){return (*env)->NewStringUTF(env, "Hello Jni");}
通过ndk生成so文件
在jni目录中编写Application.mk文件
12APP_MODULES := helloAPP_ABI := all编写Android.mk文件
12345LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := helloLOCAL_SRC_FILES =: sayHello.cinclude $(BUILD_SHARED_LIBRARY)在terminal中切换到jni目录下,执行ndk-build命令,然后就会生成so文件。
- 此时项目构建完成,可以在build.gradle中指定so文件的位置,如图:
如果不指定so文件的位置,可以在在main目录下创建jniLibs文件夹,然后把libs文件夹中生成的文件复制到jniLibs下,jniLibs文件夹是默认的so文件的存放目录。 - 调用C的方法,通过静态代码块加载so库。123static {System.loadLibrary("hello");}
如图:
项目地址
https://github.com/PhoenixGJH/JniDemo