如何引用第三方SO文件

bbjyczy 2013-03-20 08:55:56
各位神,
鄙人的项目里已经有了3个SO文件,这三个SO文件都是自己写C语言然后生成的。当然也成功了。无话可说。
问题是,鄙人现在要引用BAIDU的locSDK3.SO,也就是GPRS。请问该如何添加呢?我直接把locSDK3.SO放进armeabi文件夹里,会被删除掉。请问该如何处理,一定要您自己做过的哦。

我的做法如下:
第一步: 在JNI文件夹下面生成一个新的目录prebuilt,然后在里面生成一个android.mk,把locSDK3.SO COPY进prebuilt.此android.mk 内容如下:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := locSDK3
LOCAL_SRC_FILES := liblocSDK3.so
include $(PREBUILT_SHARED_LIBRARY)


第二步: 在jni目录下android.mk文件后面添加
include $(CLEAR_VARS)

LOCAL_SHARED_LIBRARIES := prebuilt/locSDK3
include $(LOCAL_PATH)/prebuilt/Android.mk


这时在libs目录下会新生成一个liblocSDK3.so文件,只有5K。系统会提示安装这个文件。
Install : liblocSDK3.so => libs/armeabi/liblocSDK3.so
我觉得这是有问题的。因为我看armeabi目录下的liblocSDK3.so 只有5K。而真实的liblocSDK3.so有40K
...全文
13279 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
_平凡之路_ 2015-08-20
  • 打赏
  • 举报
回复
31楼的方法可用,简单明了,感谢一下
商心国事 2015-08-18
  • 打赏
  • 举报
回复
请教 android5.0源码下的这个示例为什么都编译不过,直接mmm编译,提示No rule to make target development\ndk\tests\prebuilt-library\jni
catom_w 2015-05-08
  • 打赏
  • 举报
回复
请问楼主 怎么在 一个 android.mk 文件中 导入 多个 so 库??
gcqinging 2014-04-10
  • 打赏
  • 举报
回复
31楼的方法可用,简单明了,感谢一下
muhoor 2014-02-21
  • 打赏
  • 举报
回复
LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
  
LOCAL_MODULE    := txpay
LOCAL_SRC_FILES := prebuilt/$(TARGET_ARCH_ABI)/libtxpay.so
include $(PREBUILT_SHARED_LIBRARY)





include $(CLEAR_VARS)

 
LOCAL_MODULE := game_shared
 
LOCAL_MODULE_FILENAME := libgame
 
#traverse all the directory and subdirectory
define walk
  $(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e)))
endef
 
#traverse Classes Directory
ALLFILES = $(call walk, $(LOCAL_PATH)/../../Classes)
 
FILE_LIST := hellocpp/main.cpp
FILE_LIST += $(LOCAL_PATH)/../../Classes/sql/sqlite3.c
FILE_LIST += $(filter %.cpp, $(ALLFILES))
 
FILE_INCLUDES := $(shell find $(LOCAL_PATH)/../../Classes -type d)
 
#source file will be compiled
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
 
                   
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../external/Box2D/ \
	$(FILE_INCLUDES) \
 
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static box2d_static



include $(BUILD_SHARED_LIBRARY)

 
$(call import-module,CocosDenshion/android) \
$(call import-module,cocos2dx) \
$(call import-module,extensions) \
$(call import-module,external/Box2D)
贴个昨天弄的吧,花了半天时间折腾,结果发现不用多个mk,一个就行,只需添加3-7行处的代码就可以了,而且要放最前面,放后面不行 prebuilt/$(TARGET_ARCH_ABI)中的prebuilt就是jni里新建的prebuilt文件,其实建不建无所谓,prebuilt里面有4个文件夹:armeabi、armeabi-v7a、mips、x86,每个文件夹里放着不同架构的libtxpay.so库, $(TARGET_ARCH_ABI)则是按cpu架构自动选择armeabi、armeabi-v7a、mips、x86这些架构中的库,我的测试是默认只复制armeabi中的libtxpay.so库,在application.mk中添加APP_ABI := armeabi armeabi-v7a后,则会同时复制armeabi armeabi-v7a的库 发现这方面网上搜出来的大部分都是同样的内容,说得也不是很清楚,所以把自己的收获也贴出来 难得回复。。。
晚秋10 2014-01-16
  • 打赏
  • 举报
回复
请教各位,我想引用一个图片处理库,文件名libfreeimage.so,我将文件直接放到jni目录下,这是Android.mk,但是编译有错误,请教各位出了什么问题。 #Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE :=GISView LOCAL_CFLAGS :=-Werror LOCAL_C_INCLUDES:=$(LOCAL_PATH) /jni LOCAL_C_INCLUDES +=$(LOCAL_PATH) ../android-ndk-r9/sources/cxx-stl/stlport LOCAL_SRC_FILES := com_example_test_GisGlobeLib.cpp \ RenderingEngine.TexturedES2.cpp \ TileSet.cpp \ Tile.cpp \ Camera.cpp \ Task.cpp LOCAL_LDLIBS :=-llog -lGLESv2 -L$(SYSROOT)/usr/lib #LOCAL_SHARED_LIBRARIES := freeimage include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := freeimage LOCAL_SRC_FILES := libfreeimage-3.15.4.so include $(PREBUILT_SHARED_LIBRARY)
leo569_163-com 2013-12-03
  • 打赏
  • 举报
回复
靠,必须要回复一下了,不然不足以平复我兴奋的心情,终于TMD搞定了,一下午加一晚上疯狂的查搜各种资料。这个帖子是我早期发现的一个非常靠谱的贴,无奈实在是安卓小白,刚接触一星期,之前在VS下开发,移植到xcode,实在看不懂mk里面的东西。 网上最多的答案是在jni下新建prebuilt文件夹,将so文件copy进入,在新建一Android.mk里面内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := xxx
LOCAL_SRC_FILES := xxx.so
include $(PREBUILT_SHARED_LIBRARY)
然后在外面,就是JNI目录下的Android.mk中添加 LOCAL_SHARED_LIBRARIES := xxx (xxx就是上个mk中的LOCAL_MODULE) 然后在最后加上 include $(LOCAL_PATH)/prebuilt/Android.mk 修改完毕,运行,编译不过。比较白,看不懂报错信息。 几番折腾下,决定按楼主的解决方案,so直接放在jni下,即与Android.mk在同一路径。 又一番折腾,还是编译报错,除非我把最后一句include $(PREBUILT_SHARED_LIBRARY)改成include $(BUILT_SHARED_LIBRARY)。可以编译过,但so严重缩水,变成5K。 又换回前一种方法,仔细看报错,好像是路径问题,发觉我的mk中有这么俩句 $(call import-add-path, E:/cocos2d-x-2.2)\ $(call import-add-path, E:/cocos2d-x-2.2/cocos2dx/platform/third_party/android/prebuilt)\ 就是这两句,改变了LOCAL_PATH的值 在使用include $(LOCAL_PATH)/prebuilt/Android.mk时,找不到路径。 同时 LOCAL_SHARED_LIBRARIES := XXX 这句应该包含在 include $(CLEAR_VARS) LOCAL_SHARED_LIBRARIES := xxx include $(PREBUILD_SHARED_LIBRARY) 终于完成,完美拷贝到armeabi文件夹下。 至于楼主的解决方案,我又试了下,还是没成功,不知道问题在哪,时间紧张,暂时没精力再弄
weida0906 2013-12-03
  • 打赏
  • 举报
回复
我的项目中自身会生成一个so文件 还需要添加两个第三方so文件 直接复制进去项目会自动删除拿两个文件 我通过修改mk文件 so文件保存进去了 但是程序运行的时候会报so文件找不到。。。楼主大人能不能帮忙解答一下
jameslin_2011 2013-09-27
  • 打赏
  • 举报
回复
就不能贴完整的呀。。。看不懂
langmanxch 2013-09-10
  • 打赏
  • 举报
回复
引用 24 楼 bbjyczy 的回复:
看起来似乎是搞定了。不用另外生成MK,第三方的SO文件COPY到JNI目录。然后在JNI目录的MK文件的末尾添加include $(CLEAR_VARS) LOCAL_MODULE := locSDK3 LOCAL_SRC_FILES := locSDK3.so include $(PREBUILT_SHARED_LIBRARY)。 我之前因为把liblocSDK3.so COPY到JNI目录而不是locSDK3.so。所以报找不到文件。 感谢lsk0372,tf110012 以及各位的指点。
正解!!这讨论的氛围实在太好了~~
talayayaya 2013-05-15
  • 打赏
  • 举报
回复
请问能将最后的Android.mk文件内容贴出来吗?
lsk0372 2013-03-21
  • 打赏
  • 举报
回复
我就能帮你这里了,感觉你不怎么领情
lsk0372 2013-03-21
  • 打赏
  • 举报
回复
如果直接考进去,不想被删除,就去掉下面的代码: include $(CLEAR_VARS) LOCAL_MODULE := locSDK3 LOCAL_SRC_FILES := liblocSDK3.so include $(PREBUILT_SHARED_LIBRARY 这个是重新生成的
bbjyczy 2013-03-21
  • 打赏
  • 举报
回复
看起来似乎是搞定了。不用另外生成MK,第三方的SO文件COPY到JNI目录。然后在JNI目录的MK文件的末尾添加include $(CLEAR_VARS) LOCAL_MODULE := locSDK3 LOCAL_SRC_FILES := locSDK3.so include $(PREBUILT_SHARED_LIBRARY)。 我之前因为把liblocSDK3.so COPY到JNI目录而不是locSDK3.so。所以报找不到文件。 感谢lsk0372,tf110012 以及各位的指点。
bbjyczy 2013-03-21
  • 打赏
  • 举报
回复
lsk0372,对于您的帮助之处,打心眼感激。言语如有不敬之处,望能谅解。
lsk0372 2013-03-20
  • 打赏
  • 举报
回复
首先给楼主说下啊,不是重新生成,是安装,这个动作是因为prebuilt产生的,因为这个库你将来c和java代码会用到,所以才会install 但是看了楼主的这个.mk文件,发现你好像并没有使用locSDK3.so这个三方库啊? LOCAL_SHARED_LIBRARIES := locSDK3这句话表示的就是你要引用的三方库的声明,但是你在前面已经用include $(CLEAR_VARS)清除变量了啊,又是一个单独的模块了 总之,我看了你的这个文件,只知道你生成了libaaa.so三个库,并没有发现你调用三方库
bbjyczy 2013-03-20
  • 打赏
  • 举报
回复


LOCAL_PATH:=$(call my-dir)


     include $(CLEAR_VARS)
  
     LOCAL_MODULE := locSDK3
     LOCAL_SRC_FILES := prebuilt/liblocSDK3.so
     include $(PREBUILT_SHARED_LIBRARY) 
     
#######################################################
include $(CLEAR_VARS)
#here we give our modules name and source file(s)

LOCAL_MODULE :=aaa
LOCAL_SRC_FILES :=aaa.c
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
#here we give our modules name and source file(s)

LOCAL_MODULE :=aaaInit
LOCAL_SRC_FILES :=aaaInit.c
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
#here we give our modules name and source file(s)

LOCAL_MODULE :=aaaMainActivity
LOCAL_SRC_FILES :=aaaMainActivity.c
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
#here we give our modules name and source file(s)

LOCAL_MODULE :=aaaMailService
LOCAL_SRC_FILES :=aaaMailservice.c
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
#here we give our modules name and source file(s)

LOCAL_MODULE :=aaaMail
LOCAL_SRC_FILES :=aaaMail.c
include $(BUILD_SHARED_LIBRARY)
#############################################################
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := locSDK3
上面是jni目录下android.mk文件的内容,还是重新生成locSDK3.so。所以只有5K。
bbjyczy 2013-03-20
  • 打赏
  • 举报
回复
2楼和3楼的神,我也觉得5K的locSDK3.SO是重新生成的。按照二楼的神的指点还是重新生成一个locSDK3.SO。
bbjyczy 2013-03-20
  • 打赏
  • 举报
回复
我没有文件要和locSDK3.SO同名的。也没有文件和locSDK3.SO是同名的。
lsk0372 2013-03-20
  • 打赏
  • 举报
回复
引用 7 楼 tf110012 的回复:
引用 6 楼 lsk0372 的回复:引用 3 楼 tf110012 的回复:直接将locSDK3.SO拷进去就行了,android.mk之中不做任何修改,因为.mk是编译时用到的,相当于一个索引,用于指定编译哪些c文件,进而生成so文件,而既然是.so,说明文件已经编译过了,不需要再编译的,至于为什么会变小,是因为在.mk文件中指定了编译一个locSDK3.SO,编译时……
不好意思,是我说话有点重了,道歉,道歉
加载更多回复(15)

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧