- android学习
- NDK环境搭建
- 编写so
- 在android项目中调用生成的so
- 更改CMakeLists.txt
- 新建调用类
- 编写cpp代码
- 调用和运行
- 注意事项
- jstring的转换
- 缩减app体积
在Ubuntu18下搭建ndk环境并生成so,Android Studio新建android项目测试so调用是否正常。
源码及使用文件 link.
NDK官网下载链接: link.
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 这次下载的版本是r21e ;
- 传送到服务器或者虚拟机上,/usr/local下新建目录ndk;
- 解压文件;
sudo unzip android-ndk-r21e-linux-x86_64.zip
5. 配置系统环境;
sudo vim /etc/profile
文件尾添加
export NDKROOT=/usr/local/ndk/android-ndk-r21e export PATH=$NDKROOT:$PATH
:wq!保存退出更新环境配置
source /etc/profile
查看ndk配置是否成功
ndk-build编写so
-
新建jni文件夹,新建Android.mk和Application.mk以及测试代码文件;
-
执行ndk-build成功后在jni同目录下生成libs里的so;
test.cpp
// test.cpp
#include "test.h"
void fun1(){
printf("测试jni");
}
int fun2(int a, int b){
return a+b;
}
test.h
// test.h #includevoid fun1(); int fun2(int a, int b);
Android.mk
LOCAL_PATH:=$(call my-dir) APP_PLATFORM=android-16 include $(CLEAR_VARS) LOCAL_MODULE:=test LOCAL_SRC_FILES:=test.cpp test.h LOCAL_LDLIBS := -lz -llog -L$(SYSROOT)/usr/lib include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_MODULES = libtest //APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64 APP_ABI := armeabi-v7a arm64-v8a在android项目中调用生成的so
- 在项目右键新建c++模块
2.在main目录下新建jniLibs文件,把生成的so文件放在这个文件夹,并更改app的build.grade
sourceSets {
main {
jniLibs.srcDirs = ['jniLibs']
}
}
更改CMakeLists.txt
新建调用类
新建Tool类,在静态块static{}中加载so,通过选中函数然后快捷键Alt + Enter在cpp文件中生成链接函数
extern "C"
JNIEXPORT void JNICALL
Java_com_claire_jni_Tool_testString(JNIEnv *env, jclass clazz, jstring str) {
const char *input_cstr = env->GetStringUTFChars(str, NULL);
LOGI("传入字符串%s",input_cstr);
//使用完释放
env->ReleaseStringUTFChars(str, input_cstr);
}
缩减app体积
指定调用的架构
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
abiFilters 'armeabi-v7a'
}
}
ndk{
abiFilters "armeabi-v7a"
}
切换在Project视图下build/intermediates/cmake可以看到项目包含的so



