动态库和静态库

动态库: libxxx.so
运行的时候,才会去加载,加载一次就在内存中存在副本,其他地方使用就都是公用的。使用场景就是 高德百度sdk对外开房
静态库: libxxx.a
编译期把静态库完整的copy一份去执行,使用场景是如果不需要对外开放就使用静态库

编译静态库、动态库

先编写一个get.c 和 get.h文件
localhost:test01 dsh$ cat test_get.h

#include <stdio.h>int test_get();

localhost:test01 dsh$ cat test_get.c

#include "test_get.h"int test_get(){return 1991;
}

cat是一个linux查看文件内容的命令

ndk编译动态库:

$NDK_GCC_arm $NDK_CFIG_arm -fPIC -shared get.c -o libget.so

ndk编译静态库: 必须使用 arm-linux-androideabi-ar

必须先,用交叉编译打出来的 .o,不能使用gcc

$NDK_GCC_arm $NDK_CFIG_arm -fPIC -c get.c -o get.o

NDK_AR_arm="/root/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar"

$NDK_AR_arm rcs -o  libget.a *.o

$NDK_GCC_arm $NDK_CFIG_arm $NDK_AR_arm 是自己配置的环境变量名字,根据自己的喜好定义

下面是我的定义

#NDK 交叉编译 环境配置
export NDK_GCC_arm="/Users/xxx/Downloads/android/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc"export NDK_CFIG_arm="--sysroot=/Users/xxx/Downloads/android/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /Users/xxx/Downloads/android/NDK/android-ndk-r17c/sysroot/usr/include -isystem /Users/xxx/Downloads/android/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"export NDK_AR_arm="/Users/xxx/Downloads/android/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar"

mk环境动态库 和 静态库使用

1、创建mk环境AS项目
创建一个普通的AS项目,然后在build.gradle 文件上中添加下面注释部分的代码

android {compileSdkVersion 28buildToolsVersion "29.0.2"defaultConfig {applicationId "com.example.ndk_mk_01"minSdkVersion 19targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"//设置NDK支持的环境externalNativeBuild{ndkBuild{abiFilters 'armeabi-v7a'}}ndk {//设置支持的SO库架构//abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'abiFilters "armeabi-v7a"}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}//指定mk文件的位置externalNativeBuild{ndkBuild{path 'src/main/ndkDir/Android.mk'}}
}

2、编写Android.mk文件

标准的配置 1 2 3 4步

# 1、 源文件路径在哪
# LOCAL_PATH 其实就是Android.mk文件的位置
LOCAL_PATH := $(call my-dir)$(info "LOCAL_PATH:======== ${LOCAL_PATH}")# 2、清理
include $(CLEAR_VARS)# todo 预编译库的引入 提前编译好的库
LOCAL_MODULE := test_get
LOCAL_SRC_FILES := libtest_get.a
#LOCAL_SRC_FILES := libtest_get.so#告诉构建工具是静态库
include $(PREBUILT_STATIC_LIBRARY)
#include $(PREBUILT_SHARED_LIBRARY)# 清理自己的库
include $(CLEAR_VARS)# 3、指定库的名字
LOCAL_MODULE := test_get_jarLOCAL_SRC_FILES := test01.c \
test02.c# todo 链接进来
# 静态库链接
LOCAL_STATIC_LIBRARIES := test_get
# 动态库的链接
# LOCAL_SHARED_LIBRARIES := test_get# 导入log
LOCAL_LDLIBS    := -lm -llog# 4、构建库
include $(BUILD_SHARED_LIBRARY)

引入静态库或者动态库的步骤
第一步、引入预编译库 上面我们使用ndk环境编译处理 .a 或者 .so 文件

LOCAL_MODULE := test_get
LOCAL_SRC_FILES := libtest_get.a
#LOCAL_SRC_FILES := libtest_get.so

第二步、告诉构建工具使用的是静态库还是动态库

include $(PREBUILT_STATIC_LIBRARY)
#include $(PREBUILT_SHARED_LIBRARY)

第三步、清理(必须步骤)

include $(CLEAR_VARS)

第四步、把静态库或者动态库链接进来 跟谁链接 就是LOCAL_MODULE(test_get_jar)

# 静态库链接
LOCAL_STATIC_LIBRARIES := test_get
# 动态库的链接
# LOCAL_SHARED_LIBRARIES := test_get

3、静态库 动态库调用
编一个c文件 叫test01.c

#include <jni.h>
#include <android/log.h>#define TAG "dsh"
#define LOGD(...)__android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)extern int test_get();//extern "C"
JNIEXPORT void JNICALL
Java_com_example_ndk_1mk_101_MainActivity_testGet(JNIEnv * env,jobject instance) {LOGD("Java_com_example_ndk_1mk_101_MainActivity_testGet %d",test_get());
}

在MainActivity中调用

static {System.loadLibrary("test_get_jar");
}@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);testGet();
}public native void testGet();

cmake环境动态库静态库使用
1、新建一个c++的as项目。一定要是c++
2、配置cmake的gradle配置文件

android {compileSdkVersion 28buildToolsVersion "29.0.2"defaultConfig {applicationId "com.example.ndk_cmake_01"minSdkVersion 19targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {//cppFlags "" 默认支持四大平台abiFilters 'armeabi-v7a'}}ndk{abiFilter 'armeabi-v7a'}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}}}

3、配置CMakeLists.txt文件

cmake_minimum_required(VERSION 3.4.1)message("Camke 路径地址 ${CMAKE_SOURCE_DIR}")file(GLOB allcpp *.cpp)add_library(native-libSHARED${allcpp}
)
#[[# 导入静态库
add_library(test_get STATIC IMPORTED)
set_target_properties(test_get PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libtest_get.a)]]# 导入动态库
add_library(test_get SHARED IMPORTED)
set_target_properties(test_get PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libtest_get.so)
#${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libget.so
find_library(log-liblog)target_link_libraries(native-lib${log-lib}test_get
)

4、调用静态 或者动态库方法

    static {//如果是动态库 必须添加加一次System.loadLibrary("test_get");System.loadLibrary("native-lib");}

NDK01-打包静态库 动态库在mk和cmake环境配置使用相关推荐

  1. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  2. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    0. 引言 UNIX是一个注册商标,是要满足一大堆条件并且支付可观费用才能够被授权使用的一个操作系统.linux是unix的克隆版本,是由其创始人Linus和诸多世界知名的黑客手工打造的一个操作系统. ...

  3. Linux-(C/C++)生成并使用静态库/动态库

    静态库/动态库概要 在Windows下静态库的后缀为:.lib.动态库后缀为:.dll:而在Linux下静态库的后缀为:.a.动态库的后缀为:.so. 那么什么是静态库呢? 首先我们来看看程序编译的大 ...

  4. java动态打包_java 调用动态库打包sdk

    java连接c++动态库并生成jar包提供给别人调用 1.需要将java通过jni生成头文件,并导入到c++项目并对c++进行jni方法继承 在项目的src目录执行,否则会提示 错误:找不到符号 ja ...

  5. Linux学习---静态库 动态库

    今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用E ...

  6. 软件库Library之静态库\动态库和静态加载\动态加载

    软件库Library之静态库\动态库和静态加载\动态加载 动态库之导入库 https://blog.csdn.net/wallaceli1981/article/details/5740718 * 动 ...

  7. 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )

    文章目录 I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edi ...

  8. ar nm ldd 静态库 动态库

    一.ar的基本用法 ar命令可以用来创建.修改库,也可以从库中提出单个模块.库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member).原始文件的内容.模式.时间 ...

  9. 【Linux后端开发必问】操作系统系列(Linux常用命令、文件权限修改、静态与动态库的制作)

    目录 一.说说常用的Linux命令 二.文件权限如何修改 三.静态库和动态库的制作 1.静态库 2.动态库的制作 3.两者优势对比 一.说说常用的Linux命令 1.cd命令:用于切换当前目录: 2. ...

最新文章

  1. scrapy爬虫框架爬取词语、医疗问答
  2. es修改排序_java 如何实现ElasticSearch自定义排序
  3. html语言中括号怎么打,HTML语言中括号(尖括号)的字符编码
  4. Oracle资源管理器(二)-- 创建和使用数据库资源计划
  5. 使用PowerShell SQL Server DBATools的IDENTITY列阈值
  6. Java中9大内置基本数据类型Class实例和数组的Class实例(转载)
  7. 第九部分 项目沟通管理
  8. --save-dev 与 --save的区别
  9. 【第三十一期】360后台开发实习面经 - 两轮技术面
  10. 采购价格条件报表(双loop)
  11. 动态规划:HDU1248-钱币兑换问题
  12. 立体视觉入门指南:对级约束与Fusiello法极线校正
  13. windows 服务器使用量高导致网络异常
  14. QQ群设置里的“不提示消息只显示数目”与“接收不提示消息”的区别
  15. 微信小程序反编译的应对方法
  16. Android之BroadcastReceiver
  17. 【如何面试求职】软件方面毕业生 求职帮助
  18. 《高数》基本初等函数 反对幂三指 (二)
  19. 哥们哥们,人机大战晓得吧玩家对战晓得吧,简易三子棋,呕心沥血500行代码手把手带你制作第一个小游戏,可以保存收藏以后接着看哟,最后有源码哦
  20. 封BT的一些常见用法

热门文章

  1. 如何使用计算机闹铃,电脑闹钟小工具、电脑闹钟小工具怎么用
  2. html设置表单禁止修改群名片,怎样设置微信别人不能修改群名
  3. APAP-基础知识(内表SORT的使用)
  4. 希望Revit2014或更高版提供什么API?(调查于2012年6月1日截止)
  5. mysql中version是关键字_mysql关键字
  6. android自定义控件之滚动广告条
  7. Koodo Reader Mac开源免费Epub阅读器2020-10-24
  8. 2021年高压电工证考试题库,高压电工试题解析
  9. 图片去水印用什么软件-图片去水印用什么软件好
  10. CentOS Liunx 7 更换为阿里云的源