目前项目当中使用了串口以及一些第三方的sdk开发包,比如荣联云的IM功能和VoIP功能,这两者都有动态库so文件,那么在系统应用当中要引入动态库的话和Android studio里面开发普通应用软件就有不一样的地方了。网络上面提供了两种方式可以引用到动态库。
第一种方式:http://ticktick.blog.51cto.com/823160/1674206 Jhuster已经总结的很清楚了,在这里我将里面涉及到的引用第三方so库的部分列出来:
——————————————————————————————————————————————————————————————
含有jni本地代码,并且本地代码依赖第三方库(.a或者so)
假设本地代码依赖的第三方库为:encoder.a 和 decoder.so
(1) 修改上述jni目录下的Android,mk,添加如下两项
:LOCAL_STATIC_LIBRARIES := libencoder
LOCAL_SHARED_LIBRARIES := libdecoder
(2) 修改HelloWorld目录下的Android.mk文件
首先把 encoder.a 和 decoder.so 都拷贝到工程根目录下,然后修改Android.mk文件,添加如下两项即可:
include $(CLEAR_VARS)
LOCAL_MODULE := libencoder
LOCAL_SRC_FILES := encoder.a
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_SUFFIX := .a
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := libdecoder
LOCAL_SRC_FILES := decoder.so
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
include $(BUILD_PREBUILT)
——————————————————————————————————————————————————————————————
通过上述方式的配置,也就是通过修改Google的serial_port demo可以通过编译,package/apps/自建系统应用/android.mk 是如下配置的:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#LOCAL_MODULE_TAGS := user
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := 应用名称
LOCAL_JNI_SHARED_LIBRARIES := serial_port
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))
在自建系统应用/jni/android.mk里做如下配置:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#TARGET_PLATFORM := android-3
LOCAL_MODULE := serial_port
LOCAL_SRC_FILES := SerialPort.c
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
最后将准备好的serial_port.so文件放入libs/armeabi下,将相应的c代码放入jni目录下,编译----》通过。
但是!!!启动应用的时候发现进入串口传输数据的功能模块应用就挂掉了!通过艰难的寻找原因的过程,最后发现打包到system/lib下面的libserial_port根本不起作用,刷机后通过adb push 将对应so文件push到system/lib下面解决!(难道编译系统重新编译了我的so文件吗!真是奇怪,么有找到原因~)
第二种方法,就是将so文件全部放到out/target/product/s~~~/system/lib里面,然后在Android.mk里面加上:
LOCAL_JNI_SHARED_LIBRARIES := libserphone(你自己的so库)
编译系统,就能够调用动态库文件了。
总结:
Google的serial_port demo在我的平台上面还是出现了第一种方式 的问题---需要重新pushso文件到system/lib才能正确读取到so文件的内容,但是荣联云的so动态库就没有出现这个问题,只要通过第二种方式进行配置和添加就能够正常读取到so里面的方法。请知道问题所在的高手们指点一下,感激之至!