linux下ndk生成so并在andorid调用
android学习
在Ubuntu18下搭建ndk环境并生成so,Android Studio新建android项目测试so调用是否正常。
源码及使用文件 link.
NDK环境搭建
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
#include <iostream>
void 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文件中生成链接函数
编写cpp代码
调用和运行
注意事项
jstring的转换
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' /*,'arm64-v8a'*/
}
}
ndk{
abiFilters "armeabi-v7a"/*,'arm64-v8a'*/
}
切换在Project视图下build/intermediates/cmake可以看到项目包含的so