重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
简单来讲:
成都创新互联公司成立与2013年,是专业互联网技术服务公司,拥有项目做网站、网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元门源做网站,已为上家服务,为门源各地企业和个人服务,联系电话:028-86922220
静态库是在连接阶段直接拷贝到代码中使用的,而共享库是由加载器加载到内存,在运行时使用的。
编译出来的静态库(这里指jar包)里每个java文件对应的class文件都单独存在,可以直接导入Eclipse等IDE使用
而编译出来的共享库(jar包),内部是Android字节码Dex格式的文件,一般无法导入Eclipse等IDE使用。Android.mk中由BUILD_JAVA_LIBRARY指定生成共享BUILD_STATIC_JAVA_LIBRARY指定生成静态库。
属于
静态库全称静态链接库,动态库全称动态链接库,看到全称就知道什么意思了吧?也就是说在链接的时候才会用到的库,只有C/C++、OC语言才会有链接过程,Java没有。
在Android中说到静态库和动态库,一般说的都是C/C++代码,我们知道在android中是通过jni技术访问到C代码的,我们会把C/C++打包成so文件,这个就是动态库(共享库)。如果我们想要使用的C库是.a形式的静态库时,我们要把.a包装成so库,具体网上有方法。
个人感觉在java语言中讨论静态库和动态库就是个伪概念,java是的编译结果是字节码文件,不是二进制文件,而且没有链接的过程,jvm在解释执行java代码的时候调用C++代码只能是动态的。
在C++和object C开发中,用编译链接的过程,静态库在链接过程中,会和自己写的源代码打到一块,多个程序多个静态库。动态库不会打到一块,如果有共享情况的话,系统只会加载一次。
OC的代码处理过程是很复杂的,有预处理、编译、链接过程,预处理就是处理宏什么的,编译这个过程就很复杂了,有编译前端和编译后端,编译称机器码(中间还会有汇编的过程),链接就是链接动态库或者静态库。
Android(java)代码处理过程就很简单啦,毕竟是运行在虚拟机上的。没有所谓的预处理,直接编译,这里的编译也就是把java代码转化成字节码,这个编译和OC中的编译可不是一个概念,只不过也这么叫而已。后续Aandroid还会用dex工具把.class打包成.dex,不同的VM模式(5.0以后都是ART)会对.dex进行不同的优化,具体看Android 编译到运行APK过程总结。需要提一下的是,ART采用AOT和JIT技术,在安装或者运行的时候,会把字节码转化成机器码,这个机器码也会受VM控制的,具体看Android之Dalvik 、ART
C/C++、Object C属于编译型语言,这是毋庸置疑的,因为它们都会在生成安装包之前编译成机器码。
关于编译静态库:
android.mk和xxx.cpp放在新文件夹里:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \xxx.cpp
LOCAL_MODULE:= libx
include $(BUILD_STATIC_LIBRARY)
生成静态库libx.a文件
关于链接静态库:
有两种方法:
1、把libx.a文件放在android.mk同一目录下,添加:
LOCAL_PREBUILT_LIBS += libx.a
2、同上,添加:
include $(CLEAR_VARS)LOCAL_MODULE := libxLOCAL_SRC_FILES := libx.ainclude $(PREBUILT_STATIC_LIBRARY)LOCAL_STATIC_LIBRARIES += libx
貌似第二种是NDK里比较常见,第一种在其他的android.mk里比较常见。
关于编译静态库:
android.mk和xxx.cpp放在新文件夹里:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \xxx.cpp
LOCAL_MODULE:= libx
include $(BUILD_STATIC_LIBRARY)
生成静态库libx.a文件