首页创建Android应用工程

1.Java层调用SO库

1
2
3
4
5
6
7
8
9

public class JavaCallJNI {

    static  {
        System.loadLibrary("JniTest");
    }

    public static native int showValue(int value);
}

image

2.创建目录jni

app/scr/main/下,创建jni文件目录

3.SO库配置文件

在jni目录下,创建Android.mk文件文件内容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jniTest
LOCAL_SRC_FILES := com_ksnowlv_hellojniforjava_JavaCallJNI.c

include $(BUILD_SHARED_LIBRARY)

其中

  • LOCAL_MODULE := JniTest

    这里JniTest,是将要生成的.so库的名字,会自动加上 lib前缀, 最终生成库文件:libJniTest.so 如果要引用该库:System.loadLibrary(“JniTest”)

  • LOCAL_SRC_FILES := com_ksnowlv_hellojniforjava_JavaCallJNI

      JNI头文件com_ksnowlv_hellojniforjava_JavaCallJNI.h对应的.c文件
      命名方式:包名+类名+.c
    

terminal中生成com_ksnowlv_hellojniforjava_JavaCallJNI.h头文件

ksnowlvdeMacBook-Pro:java ksnowlv$ javac com/ksnowlv/	hellojniforjava/JavaCallJNI.java 
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
ksnowlvdeMacBook-Pro:java ksnowlv$ javah -d ../jni 	com.ksnowlv.hellojniforjava.JavaCallJNI
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
ksnowlvdeMacBook-Pro:java ksnowlv$ cd ..

image

实现文件中内容如下

#include "com_ksnowlv_hellojniforjava_JavaCallJNI.h"

JNIEXPORT jint JNICALL 	Java_com_ksnowlv_hellojniforjava_JavaCallJNI_showValue(JNIEnv * enc, jclass cls , jint value) {
	value = value + 1;
	return value;
}

4.在SO库配置文件中,添加生成SO

Application.mk添加:

APP_ABI := all	

会生成所有主流 ABI 类型的 .so 库

5.更新build.gradle文件配置

defaultConfig下增加ndk配置

	ndk {
		moduleName "JniTest" //System.loadLibrary("JniTest");
	}

在buildTypes上面添加jni.srcDirs的配置

	sourceSets {
       main {//建议这里直接使用'libs'目录,
       //因为当使用其他包有.so文件时,一般习惯也是直接拷贝进入libs目录
        jni.srcDirs = ['libs']
      }

image

6.生成so库

在终端进入jni路径:app/src/main/jni,输入ndk-build即生成各种版本的so

1
2
3
4
5
6
7
8

	ksnowlvdeMacBook-Pro:java ksnowlv$ javac com/ksnowlv/	hellojniforjava/JavaCallJNI.java 
	Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
	ksnowlvdeMacBook-Pro:java ksnowlv$ javah -d ../jni 	com.ksnowlv.hellojniforjava.JavaCallJNI
	Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
	ksnowlvdeMacBook-Pro:java ksnowlv$ cd ..
	ksnowlvdeMacBook-Pro:main ksnowlv$ cd jni
	ksnowlvdeMacBook-Pro:jni ksnowlv$ ndk-build

image