Android5.1-s5p6818平台Android.mk文件引入so动态库问题

来源:互联网 发布:app客户端制作软件 编辑:程序博客网 时间:2024/05/01 15:15

目前项目当中使用了串口以及一些第三方的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,添加如下两项:


1
2
LOCAL_STATIC_LIBRARIES := libencoder
LOCAL_SHARED_LIBRARIES := libdecoder


(2) 修改HelloWorld目录下的Android.mk文件


首先把 encoder.a 和 decoder.so 都拷贝到工程根目录下,然后修改Android.mk文件,添加如下两项即可:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 := userLOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := 应用名称LOCAL_JNI_SHARED_LIBRARIES := serial_portLOCAL_CERTIFICATE := platformLOCAL_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-3LOCAL_MODULE    := serial_portLOCAL_SRC_FILES := SerialPort.cLOCAL_LDLIBS    := -lloginclude $(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里面的方法。请知道问题所在的高手们指点一下,感激之至!




0 0