一、代码结构图,代码路径https://download.csdn.net/download/qq_37858386/87913001

二、cmakedemo\app\build.gradle 加下面的代码
    externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }
    externalNativeBuild {
        cmake {
            path 'src/main/jni/CMakeLists.txt'
        }
    } 
三、使用loadLibrary加载so 库。
package com.hypernano.cmakedemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
    String TAG = "CMAKE_DEMO";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((TextView)findViewById(R.id.hint)).setText(GetStringFromJNI(8956));
    }
    static {
        System.loadLibrary("cmakedemo-native-jni");
    }
    public static native String GetStringFromJNI(int number);
} 
四、jni 下的CMakeLists.txt 文件,这个文件就是用来指导如何编译。
cmake_minimum_required(VERSION 3.6)
set(target cmakedemo-native-jni)
project(${target} CXX)
#message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/app/src/main/libs/${ANDROID_ABI})
file(GLOB srcs *.cpp *.c)
file(GLOB hdrs *.hpp *.h)
include_directories("${CMAKE_CURRENT_LIST_DIR}")
add_library(${target} SHARED ${srcs} ${hdrs})
target_link_libraries(${target})
 
五、JniTest.cpp文件
#include <string>
#include "JniTest.h"
extern "C"{
JNIEXPORT jstring JNICALL Java_com_hypernano_cmakedemo_MainActivity_GetStringFromJNI
         (JNIEnv *env, jclass clazz ,jint number) {
    // TODO: implement stringFromJNI()
    jstring result;
    jstring str_data;
    char str[20];
    sprintf(str, "%d",number);
    std::string hello = "I am from  cmakedemo jni C++ 202306151710";
    result = env->NewStringUTF(hello.c_str());
    str_data = env->NewStringUTF(str);
    return  result;
 }
}
 
六、JniTest.h文件
//
// Created by Watson on 2023/6/15.
//
#include <jni.h>
#ifndef CMAKEDEMO_JNITEST_H
#define CMAKEDEMO_JNITEST_H
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jstring JNICALL  Java_com_hypernano_cmakedemo_MainActivity_GetStringFromJNI
(JNIEnv *, jclass ,jint );
#ifdef __cplusplus
}
#endif
#endif //CMAKEDEMO_JNITEST_H
 
七、build - build APK之后就在build**cmake目录下生成so,点击 analyze就可以看到apk包含so库(下图右边)

九、真机运行结果,可以调用jni的接口了。

十、参考文章
Android jni开发-1(用CMake编译jni)_android cmake编译jni_ls_star的博客-CSDN博客
Android Studio CMakeList编译JNI_android cpp 编译选择架构_郭家远的博客-CSDN博客
JNI 应用:使用 CMake 编译 生成 so_cmake方式怎么生成jni库_老姚---老姚的博客-CSDN博客



















