NDK开发,CMake生成自定义so包,用JNI调用so

简单了解NDK开发,先生成一个动态库,然后另一个项目调用。

1.生成so包。

1. 创建 ‘MakeSoLib’ Android c++项目
在这里插入图片描述
2.在默认cpp内编写自定义so包的方法

#include <jni.h>
#include <string>
extern "C" std::string stringFromLib(){
    return "String from Lib!";
}

3. 编译项目 Build-Make Project
如图所示,build文件夹生成了我们需要的so包,包含四种架构。
在这里插入图片描述

2.调用so包

1.新建 ‘UseSoLib’ Android c++项目
2.将之前生成的so包拷贝至如下目录
在这里插入图片描述
3.修改CMakeLists文件

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

add_library(libtest #指定需要加载的so包别名
        SHARED# 动态库标志,static 为静态库
        IMPORTED )#导入第三方库so包 标志
        
#指定so包中用到的头文件目录,这里不需要
#include_directories(${path} /src/main/cpp/src)

set_target_properties(libtest #指定加载的so包别名
        PROPERTIES
        IMPORTED_LOCATION
        "${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libnative-lib.so")#so包的路径

# 本地jni配置
add_library(
        mylib # 本地so包名称,用于代码System.loadLibrary("mylib"),调用的名称
        SHARED
        native-lib.cpp) #jni 源文件可指定多个
find_library(
        log-lib
        log)
target_link_libraries( #链接所有的so包
        mylib
        libtest
        ${log-lib})

4. 在bulide 文件中指定动态库位置

    sourceSets{
    
    
        main{
    
    
            jniLibs.srcDirs=['src/main/jniLibs']
        }
    }

5.修改cpp文件

#include <jni.h>
#include <string>
extern "C" std::string stringFromLib();
using namespace std;
extern "C" JNIEXPORT jstring JNICALL
Java_me_sailor_usesolib_MainActivity_fromJNI(
        JNIEnv *env,
        jobject /* this */) {
    return env->NewStringUTF(stringFromLib().c_str());
}

6.修改MainActivity文件

package me.sailor.usesolib;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    
    
   static {
    
    
        System.loadLibrary("mylib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(fromJNI());
    }
    
    public native String fromJNI();
}

7.运行项目,可看到两个so已经打入spk内了(jni so 包,和导入的第三方so包)
在这里插入图片描述
8.查看结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_33431394/article/details/107616707