android studio jni 开发步奏如下:
1、在AS中新建一个Project,新建native JniUtils类
public class JniUtils { public native String getVersion(); }
2、生成class文件
3、根据生成的class文件,javah生成对应的 .h头文件。
C:\Users\xin\workspace\jniDemo\app\build\intermediates\classes\debug>javah -jni com.demo.sheng.jnidemo.JniUtils C:\Users\xin\workspace\jniDemo\app\build\intermediates\classes\debug>ls android com com_demo_sheng_jnidemo_JniUtils.h
注:当java类中有相关的android依赖类时(android.content.Context),会报异常javah 找不到类android.content.Context。
原因是环境变量未设置,要在CLASSPATH下增加
C:\...\sdk\platforms\android-23\android.jar
h文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_demo_sheng_jnidemo_JniUtils */ #ifndef _Included_com_demo_sheng_jnidemo_JniUtils #define _Included_com_demo_sheng_jnidemo_JniUtils #ifdef __cplusplus extern "C" { #endif /* * Class: com_demo_sheng_jnidemo_JniUtils * Method: getVersion * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_demo_sheng_jnidemo_JniUtils_getVersion (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif5、在app/main目录下创建jni目录,把h拷贝过来,并编写JniUtils.c文件
#include "com_demo_sheng_jnidemo_JniUtils.h" JNIEXPORT jstring JNICALL Java_com_demo_sheng_jnidemo_JniUtils_getVersion (JNIEnv * env, jobject obj){ return (*env)->NewStringUTF(env," Android Studio NDK JNI developer ! current version 1.0 !"); }
6、编写Android.mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := JniUtils LOCAL_SRC_FILES := JniUtils.c LOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY)
7、ndk-build 生成so文件
C:\Users\xin\workspace\jniDemo\app\src\main\jni>ndk-build [arm64-v8a] Compile : JniUtils <= JniUtils.c [arm64-v8a] SharedLibrary : libJniUtils.so [arm64-v8a] Install : libJniUtils.so => libs/arm64-v8a/libJniUtils.so [x86_64] Compile : JniUtils <= JniUtils.c [x86_64] SharedLibrary : libJniUtils.so [x86_64] Install : libJniUtils.so => libs/x86_64/libJniUtils.so [mips64] Compile : JniUtils <= JniUtils.c [mips64] SharedLibrary : libJniUtils.so [mips64] Install : libJniUtils.so => libs/mips64/libJniUtils.so [armeabi-v7a] Compile thumb : JniUtils <= JniUtils.c [armeabi-v7a] SharedLibrary : libJniUtils.so [armeabi-v7a] Install : libJniUtils.so => libs/armeabi-v7a/libJniUtils.so [armeabi] Compile thumb : JniUtils <= JniUtils.c [armeabi] SharedLibrary : libJniUtils.so [armeabi] Install : libJniUtils.so => libs/armeabi/libJniUtils.so [x86] Compile : JniUtils <= JniUtils.c [x86] SharedLibrary : libJniUtils.so [x86] Install : libJniUtils.so => libs/x86/libJniUtils.so [mips] Compile : JniUtils <= JniUtils.c [mips] SharedLibrary : libJniUtils.so [mips] Install : libJniUtils.so => libs/mips/libJniUtils.so
8、build.gradle中设置(不设置会报错Your project contains C++ files but it is not using a supported native build system.)
sourceSets.main { jniLibs.srcDirs 'src/main/libs' jni.srcDirs = [] // This prevents the auto generation of Android.mk }9、在 JniUtils类中加载so文件
static { System.loadLibrary("JniUtils"); }10、 编译工程运行