六、Android Studio 工程配置 CMakeLists.txt 构建脚本
配置构建脚本 : 配置 src/main/cpp/CMakeLists.txt 构建脚本 ;
cmake_minimum_required(VERSION 3.4.1) add_library( # 函数库名称 native-lib # 动态库类型 SHARED # 源文件 native-lib.cpp) find_library( # 日志库 log-lib log ) find_library( # JNI 图形库 jnigraphics-lib jnigraphics ) # 设置头文件搜索路径 include_directories(include) # 通过设置编译选项, 设置函数库的搜索路径 # 此处的 ANDROID_ABI 是在 # build.gradle android->defaultConfig->externalNativeBuild->cmake # 下的 abiFilters 中设置 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}") target_link_libraries( # 链接动态库 native-lib # 查找到的 libturbojpeg 静态库 turbojpeg ${log-lib} ${jnigraphics-lib} )
七、Android Studio 工程配置 build.gradle 构建脚本
在 build.gradle 构建脚本中主要注意两个配置选项 :
① ARM 函数库的 CPU 架构 : abiFilters ‘armeabi-v7a’
② C/C++ 代码及函数库的构建脚本 : path “src/main/cpp/CMakeLists.txt”
apply plugin: 'com.android.application' android { compileSdkVersion 29 defaultConfig { applicationId "kim.hsl.pc" minSdkVersion 16 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { cppFlags "" abiFilters 'armeabi-v7a' } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" //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' }
八、测试 libjpeg-turbo 函数库
在 native-lib.cpp 代码中 , 使用 libturbojpeg.a 函数库中的结构体 , 看是否可以使用 ;
#include <jni.h> #include <string> #include <jpeglib.h> #include <android/bitmap.h> #include <malloc.h> #include <android/log.h> #include <bitset> #include <iosfwd> extern "C" JNIEXPORT jstring JNICALL Java_kim_hsl_pc_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++"; // 测试 libturbojpeg.a 函数库 jpeg_compress_struct jcs; __android_log_print(ANDROID_LOG_INFO, "JPEG", "jpeg_compress_struct jcs = %d", jcs.image_width); hello = hello + " , jpeg_compress_struct jcs = " + std::to_string(jcs.image_width); return env->NewStringUTF(hello.c_str()); }
经测试函数库可用 ;