JNI开发
1 创建一个java文件
package com.example.jni;
public class JNITools {
static {
System.loadLibrary("jniTest");
}
public static native int add(int a,int b);
}
2 生成class文件
通过android studio直接编译生成class文件,位于app\build\intermediates\javac\debug\classes\com\example\jni目录下
3 生成头文件
在main目录下创建一个jni目录,通过右键new,然后选Folder,再选中JNI Folder。该jni目录,专门用于放置jni层的文件,创建好后,位于app/src/main/jni
然后通过javac -h或者javah生成.h头文件
javac -h {.h文件的放置位置} java文件
//如:
javac -h jni java/com/example/jni1/JNITools.java
最后通过引用该头文件,开发cpp后者c代码
生成的.h头文件如下,该方法就是JNITools.java中add方法在jni中的声明:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_JNITools */
#ifndef _Included_com_example_jni_JNITools
#define _Included_com_example_jni_JNITools
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jni_JNITools
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_jni_JNITools_add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
4 配置编译生成so库
- 定义com_example_jni_JNITools.cpp实现Java_com_example_jni_JNITools_add方法
//
// Created by Administrator on 2021/9/5.
//
#include "com_example_jni_JNITools.h"
JNIEXPORT jint JNICALL Java_com_example_jni_JNITools_add
(JNIEnv * env, jclass, jint a, jint b) {
return a+b;
}
- 配置Android.mk
//配置参与编译的文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jniTest
LOCAL_SRC_FILES := com_example_jni_JNITools.cpp
include $(BUILD_SHARED_LIBRARY)
- 配置Application.mk
APP_ABI := armeabi-v7a x86
APP_PLATFORM := android-16
- 配置build.gradle
在build.gradle中添加ndk-build的编译配置,是的ndk-build可以找到Android.mk文件
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
//在build.gradle中添加ndk-build的编译配置,是的ndk-build可以找到Android.mk文件
externalNativeBuild {
ndkBuild {
path 'jni/Android.mk' //这个是Android.mk文件的路径
}
}
- 进入main目录,通过终端命令行执行ndk-build即可调用jni/Android.mk进行编译,在main目录下生成libs目录并生成不同架构的so库
如下所示:
5 使用so库
- 在build.gradle中配置so库路径:
defaultConfig {
applicationId "com.example.jni"
minSdkVersion 30
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//配置so库路径
sourceSets{
main{
jniLibs.srcDirs=['src/main/libs']
}
}
}
- 在类中进行加载,通常在声明native方法的类中进行静态加载,也可以在其他类中进行加载
package com.example.jni;
public class JNITools {
//静态代码块,在类加载的时候会执行加载
static {
System.loadLibrary("jniTest");
}
public static native int add(int a,int b);
}
- 使用
JNITools.add(14,15)
就可以调用进行加法运算了