简单了解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.查看结果