1.首先在Android SDK中选择SDK Tools,然后安装CMake版本
2.在main文件下下新建一个cpp文件夹,然后点击右键选择Add C++ to Module,在新的弹框中直接点击OK!
图一
c++ module.png
图二
ok.png
3.会自动生成文件夹
image.png
解释一下:CMakeLists.txt中的代码
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.22.1)
# Declares and names the project.
project("funwalletjni")
# 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.
add_library( # Sets the name of the library.
${CMAKE_PROJECT_NAME}
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
funwallet.cpp )
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
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 )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
${CMAKE_PROJECT_NAME}
# Links the target library to the log library
# included in the NDK.
${log-lib} )
cmake_minimum_required(VERSION 3.22.1)当前CMake版本
project("funwalletjni") C++的项目名称
声明项目名称。 项目名称可以通过{CMAKE_PROJECT_NAME} (两个 CMake 变量在顶层同步构建脚本范围)。
add_library( # Sets the name of the library.
${CMAKE_PROJECT_NAME}
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
funwallet.cpp )
列出 C/C++ 源文件以及此 CMakeLists.txt 的相对路径。
创建并命名一个库,将其设置为 STATIC 或 SHARED,并提供其源代码的相对路径。您可以定义多个库,CMake 会为您构建它们。 Gradle 会自动将共享库与您的 APK 打包。
funwallet.cpp解析
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_base_funwallet_MainActivity_startEncrypt(JNIEnv *env, jobject thiz, jstring content,jstring key) {
// JNIEnv * env:这个env可以看做是Jni接口本身的一个对象,jni.h头文件中存在着大量被封装好的函数,这些函数也是Jni编程中经常被使用到的,
// 要想调用这些函数就需要使用JNIEnv这个对象。例如:env->GetObjectClass()
// std::string result;
// jstring key = env->NewStringUTF(result.c_str());
// 获取 AES256Encryption 类
jclass clazz = env->FindClass("com/base/funwallet/util/AES256Encryption");
if (clazz == nullptr) return nullptr; // 类没有找到
// 获取 encrypt 方法的 ID
//(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 意思是传入两个String,之后返回一个String
//Ljava/lang/String,意思是 L 表示这是一个对象类型(Reference Type)。
//java/lang/String 表示类的路径,即 java.lang.String 类的路径。
jmethodID mid = env->GetStaticMethodID(clazz, "encrypt", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
if (mid == nullptr) return nullptr; // 方法没有找到
// 调用 encrypt 方法
jstring encrypted = (jstring) env->CallStaticObjectMethod(clazz, mid, content, key);
return encrypted;
}
在Android 代码中使用
这个是c++代码
external fun startEncrypt(content: String, key: String): String
companion object {
init {
//相当于注入so库,对应的是 project("funwalletjni")
System.loadLibrary("funwalletjni")
}
}
这是是Android调用
var key = "43090ab7031d425aa7f09f94b4668608"
var oldStr = "0x9e63708e220a842a7bf8ee558df138fa19bca1a2+" + 1695021542
var gk = startEncrypt("$oldStr", key)
网友评论