- Step1:创建java native 类和方法
public class BeautyNative {
static {
System.loadLibrary("beautyNative-lib"); // 加载动态库 libdemojni.so
}
/**
* 初始化上下文
*/
public static native void NativeInit();
public static native void onSurfaceCreated();
public static native void onSurfaceChanged();
public static native void onDrawFrame();
public static native void onDestroy();
}
- Step2:通过命令生成JNI 头文件
//cd 进入native 类文件下
cd D:\wechat_gallery\beauty_lib\src\main\java\com\rayvison\beauty_lib\glsurface>
//使用命令生成头文件
javac -h ./ BeautyNative.java
生成的头文件如下
- Step3:创建cpp
- Step4:创建CMakeLists.text 文件 并在build.gradle 中配置cmake
在目录下创建File 文件,命名为CMakeLists.txt,然后在build.gradle 中配置如下:
defaultConfig {
minSdk 21
targetSdk 33
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
externalNativeBuild {
cmake {
cppFlags "-std=c++17 -fexceptions -frtti"
arguments '-DANDROID_STL=c++_shared'
}
}
}
....
sourceSets {
main {
jni.srcDirs = ['src/main/cpp']
//有些项目是这个目录,根据你的实际情况填写你c代码的目录即可
// jni.srcDirs = ['src/main/jni']
jniLibs.srcDirs = ['libs']
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
配置完之后,Clean一下项目,此时,CMakeLists.txt 就生效了,以及cpp 代码也可以引用。
- Step5:CMakeLists.text 配置
cmake_minimum_required(VERSION 3.10.2)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -g")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -g -D__DEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3")
set(CLIENT_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp)
file(GLOB src-files
${CLIENT_SRC_DIR}/*.cpp
${CLIENT_SRC_DIR}/render/*.cpp)
add_library(
beautyNative-lib
SHARED
# Provides a relative path to your source file(s).
${src-files}
)
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log)
target_link_libraries(
beautyNative-lib
EGL
GLESv3
android
)
- Step6:cpp 导入头文件实现对应的方法
//
// Created by lijialun on 2023/2/24.
//
#include"com_rayvison_beauty_lib_glsurface_BeautyNative.h"
#include <jni.h>
#include <jni.h>
#include <jni.h>
#include <jni.h>
#include <jni.h>
extern "C"
JNIEXPORT void JNICALL
Java_com_rayvison_beauty_1lib_glsurface_BeautyNative_NativeInit(JNIEnv
* env,
jclass clazz
) {
// TODO: implement NativeInit()
}
extern "C"
JNIEXPORT void JNICALL
Java_com_rayvison_beauty_1lib_glsurface_BeautyNative_onDestroy(JNIEnv
* env,
jclass clazz
) {
// TODO: implement onDestroy()
}
extern "C"
JNIEXPORT void JNICALL
Java_com_rayvison_beauty_1lib_glsurface_BeautyNative_onDrawFrame(JNIEnv
* env,
jclass clazz
) {
// TODO: implement onDrawFrame()
}
extern "C"
JNIEXPORT void JNICALL
Java_com_rayvison_beauty_1lib_glsurface_BeautyNative_onSurfaceChanged(JNIEnv
* env,
jclass clazz
) {
// TODO: implement onSurfaceChanged()
}
extern "C"
JNIEXPORT void JNICALL
Java_com_rayvison_beauty_1lib_glsurface_BeautyNative_onSurfaceCreated(JNIEnv
* env,
jclass clazz
) {
// TODO: implement onSurfaceCreated()
}
打完收工!!