把这段复制到app下的Android.mk的最后,可以编译出java共享库,这个.jar除了生成在\out\target\common\obj\JAVA_LIBRARIES这里,还会copy到\out\target\product\***\system\framework下,

如果只是使用java静态库,可以include$(BUILD_STATIC_JAVA_LIBRARY),这样只会生成在\out\target\common\obj\JAVA_LIBRARIES。

-------------------------- 

include $(CLEAR_VARS)
LOCAL_MODULE :=gallery2Camera
 
LOCAL_MODULE_TAGS :=optional
LOCAL_STATIC_JAVA_LIBRARIES:= android-support-v13
LOCAL_STATIC_JAVA_LIBRARIES+= com.android.gallery3d.common2
LOCAL_STATIC_JAVA_LIBRARIES+= xmp_toolkit
LOCAL_STATIC_JAVA_LIBRARIES+= mp4parser
 
prev_compiled_rs_files:= $(call all-renderscript-files-under, src)
LOCAL_RENDERSCRIPT_SKIP_INSTALL:= $(prev_compiled_rs_files)
LOCAL_SRC_FILES :=$(call all-java-files-under, src) $(prev_compiled_rs_files)
LOCAL_SRC_FILES +=$(call all-java-files-under, src_pd)
LOCAL_MULTILIB :=both
LOCAL_CERTIFICATE :=platform
LOCAL_SDK_VERSION :=current
LOCAL_JNI_SHARED_LIBRARIES:= libjni_eglfence libjni_filtershow_filters librsjni libjni_jpegstream
LOCAL_JAVA_LIBRARIES+= org.apache.http.legacy
include$(BUILD_JAVA_LIBRARY)


静态连接库的特点是会在程序的编译链接阶段就完成函数和变量的地址解析工作,并使之成为可执行程序中不可分割的一部分。这种处理手段在某种程度上可以有效地实现代码的重复利用,使得编写程序不需要每次都从零开始。但是它的缺点也是明显的,即可执行程序的体积会随着静态链接库的增加而不断增大。如果系统中有多个可执行程序都用到了同一个静态库A,按照静态链接的做法需要把A分别打包到所有程序中,这显然是一种资源浪费。

动态链接库有2个特点:

动态链接库不需要在编译时就打包到可执行程序中,而是等到后者在运行时再实现动态的加载和 重定位。

动态链接库在被加载到内存之后,操作系统需要为他执行动态连接操作,这里也可以称为“动态链接”,前面编译阶段的链接叫“静态链接”。静态链接中也会有重定位Relocation,只是跟动态链接中的重定位有差异。只要涉及多个文件之间的链接,通常都需要重定位,只是静态链接发生在编译阶段,而动态链接发生在运行阶段。

动态链接库的核心优势就是代码共享,不单是进程内的代码共享,还包括进程间的代码共享。


动态链接库显示调用的方法:

Java层,使用System.loadLibrary(String libName)和System.load(String pathName),前者只需要支出动态链接库的名称,系统负责在预先设置的路径中去查找并加载正确的so库;后者允许将动态链接库存储到任何程序有权限访问的地方,由pathName给出完整的加载路径。这两个函数的实现主题在libjavacore.so库中,这个库是Runtime在启动过程中通过LoadNativeLibrary来加载的。

Native层,使用dlopen,dlsym等linux标准的动态链接库接口。