Android JNI 生成头文件以及cpp详细步骤

  • 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()
}


打完收工!!

猜你喜欢

转载自blog.csdn.net/Android_LeeJiaLun/article/details/129204383