大致结构:
CMakeLists.txt
# 指定 cmake 的最小版本
cmake_minimum_required(VERSION 3.4.1)
# 打印日志
message("当前CMake的路径是:"${CMAKE_SOURCE_DIR})
message("当前 CMAKE_ANDROID_ARCH_ABI 的路径:"${CMAKE_ANDROID_ARCH_ABI})
#设置生成的so动态库最后输出的路径(针对生成so用的,如果调试c++记得注释掉,并且移除项目jniLibs/arm下的so,否则包多so重复异常)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
message("so输出路径:"${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
# 批量引入源文件
file(GLOB allCpp *.cpp)
# 加入cpp源文件,SHARED:生成动态库或共享库;STATIC:生成静态库
add_library(native-lib SHARED
# native-lib.cpp 替换${allCpp} 批量导入文件
${allCpp})
# 查找指定库文件,只能找系统的
find_library(log-lib
log )
message("当前的log路径在哪里>>>>>>> ${log-lib}")
# 设置 target 需要链接的库, 开始链接指定库
target_link_libraries(native-lib
${log-lib} )
app下的build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
buildToolsVersion "30.0.0"
defaultConfig {
applicationId "com.george.myjni"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// 调试c++时候解开
// externalNativeBuild {
// cmake {
//// cppFlags "" 默认包含四大平台,生产的so种类
// abiFilters 'armeabi-v7a'
// }
// }
ndk{
// 过滤,只使用这个版本的库,否则默认的是4个平台,使用so哪几种
abiFilters 'armeabi-v7a'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
// 调试c++时候解开
// externalNativeBuild {
// cmake {
// path "src/main/cpp/CMakeLists.txt"// 指定CMakeLists 路径
// version "3.10.2"
// }
// }
}
dependencies {
// implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
c++源码:注意包名
#include <jni.h>
#include <string>
#include <android/log.h>
#include <iostream>
#define TAG "native-lib"
// __VA_ARGS__ 代表 ...的可变参数
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__);
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__);
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__);
//extern "C" JNIEXPORT void JNICALL
//Java_com_george_myjni_MainActivity_testCmake(
// JNIEnv *env,
// jclass /* this */) {
// std::string hello = "hello from C++";
// __android_log_print(ANDROID_LOG_DEBUG,"测试","main---->:%d",123);
//}
extern "C" JNIEXPORT jstring JNICALL
Java_com_fcs_jni_FCSJni_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello Word!";
return env->NewStringUTF(hello.c_str());
}
jni部分:
package com.fcs.jni;
public class FCSJni {
static {
System.loadLibrary("native-lib");
}
public static native String stringFromJNI();
}