android studio 3.2 使用cmake在jni生成及使用C/C++静态库

关于cmake jni的基本教程可以看我另外一篇博客

https://blog.csdn.net/qq_34759481/article/details/83825826

关于使用动态库可以看我的另外一篇博客。

在看本篇之前,最好先看这篇动态库的,一些比较基本的操作,都在这里面。本篇不会讲的很细。

https://blog.csdn.net/qq_34759481/article/details/83898710

总体思路

1.本教程是在Android studio中利用cmake来生成静态库.a

2.将该静态库连接到自动生成的native-lib.so

3.调用静态库的函数


1.利用cmake生成静态库.a

1.在android studio中创建好最基本的可以调用jni的框架,运行app,正常运行后进行下一步

2.创建动态库要用到的源文件static.cpp和static.h

3.在源文件中添加一些函数

static.h

#ifndef JNI_STATIC_STATIC_H
#define JNI_STATIC_STATIC_H

#include <android/log.h>
#define  LOG    "JNILOG"
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG,__VA_ARGS__)
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__)
#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG,__VA_ARGS__)
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG,__VA_ARGS__)
#define LOGF(...)  __android_log_print(ANDROID_LOG_FATAL,LOG,__VA_ARGS__)
int apple();

#endif //JNI_STATIC_STATIC_H

static.cpp

#include "static.h"

int apple()
{
    LOGD("static.cpp");
    LOGI("test jni");
    return 4396;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

add_library(static-lib STATIC src/main/cpp/static.cpp)   #将static.cpp编译成静态库

find_library(log-lib log)

target_link_libraries(static-lib ${log-lib})    #将log库链接到我们生成的静态库,使代码里面的LOGD()能够被使用

app/build.gradle

截图

关键代码

cmake {
    arguments '-DANDROID_PLATFORM=android-14','-DANDROID_TOOLCHIAN=clang'
    targets 'static-lib'
}

4.编译,make project,生成static-lib.a

编译好之后,会有两个地方存在.a文件

第一个地方:和native-lib.so的生成位置一样

第二个地方

准确的说,第一个地方里面的.a是第二个地方的.a生成后并复制进去的,而我们需要的就是第一份.a。接下来我们就要使用这份.a了。


2.将第一步中生成的.a连接到native-lib.so

1.修改CMakeLists.txt文件

cmake_minimum_required(VERSION 3.4.1)

add_library(native-lib SHARED src/main/cpp/native-lib.cpp)

add_library(static-lib STATIC IMPORTED)
set_target_properties(static-lib PROPERTIES IMPORTED_LOCATION
        ${CMAKE_CURRENT_SOURCE_DIR}/build/intermediates/cmake/debug/obj/${CMAKE_ANDROID_ARCH_ABI}/libstatic-lib.a)

find_library(log-lib log)

target_link_libraries(native-lib static-lib ${log-lib})

2.修改app/build.gradle文件

3.修改native-lib.cpp文件

#include <jni.h>
#include <string>
#include "static.h"

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_jni_1static_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    //---------------------新增--------------------
    int x = 0;
    x = apple();
    LOGI("x = %d", x);
    //----------------------------------------------
    return env->NewStringUTF(hello.c_str());
}

3.编译运行

1.虚拟机正常显示,hello from c++

2.查看日志

搜索和jni有关的日志

也是正常打印日志,说明我们的.a被调用了


注意:

在将static-lib.a链接到native-lib.so时,我们不一定要在哪个debug/obj目录下面进行连接

我们可以将static.a复制出来,进行连接。相应的,set_target_properties里面的文件位置也得修改

我在main目录下建了一个banana文件下,在下面又建了4种架构的文件夹,然后一对一复制

最后修改CMakeLists.txt文件

然后编译运行就可以了

猜你喜欢

转载自blog.csdn.net/qq_34759481/article/details/83957938
今日推荐