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

该文章详细介绍了如何在AndroidStudio中使用JNI进行原生代码开发。首先创建了一个包含native方法的Java类,然后通过`javah`命令生成JNI头文件。接着,创建C++源文件并编写对应的函数实现。通过CMakeLists.txt配置构建过程,并在build.gradle中设置CMake参数。最后,实现了C++代码与Java层的交互,但具体的函数实现尚未填充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


打完收工!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值