一、代码结构图,代码路径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博客