请教:NDK环境,调用SO库的问题

tonymause 2010-06-12 03:59:44
最近在做项目中遇到这样的问题。
如下步骤:
1. 由C程序生成的SO库(libA.so)。
2. 再做一个so库(libB.so),里面程序会调用之前的so库(libA.so)的API函数。
3. Android做成NDK工程调用so库(libB.so)。
文件Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := B

LOCAL_SRC_FILES := Jni.c \
B.c

LOCAL_C_INCLUDES := \
$(JNI_H_INCLUDE)

LOCAL_LDLIBS := -ldl -llog

include $(BUILD_SHARED_LIBRARY)


文件B.c中使用dlopen调用库A的函数。
现在我的方法是用绝对路径来调用,即参数1:"/data/data/[proj name]/lib/libA.so"
想问的是,用相对路径应该怎么调用?

我感觉是把当前Android工程的路径加到LD_LIBRARY_PATH这个环境变量里,可就是不知道怎么做。
...全文
319 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenjiazeng 2010-10-22
  • 打赏
  • 举报
回复
我也在期待答案,同问
tonymause 2010-06-19
  • 打赏
  • 举报
回复
楼上的有点高深

现在我没什么好的办法,只有把要dlopen的库push到system/lib下,这样就能直接打开,不用写路径。
makeppy 2010-06-18
  • 打赏
  • 举报
回复
同问。也在做一样的项目,杯具LD_LIBRARY_PATH只有NDK1.6才支持 1.5不行,
Android 的动态链接库在1.5 版中有很多的限制:
- 目前还没有对LD_LIBRARY_PATH, LD_PRELOAD, RTLD_LOCAL、以及其他的选择进行支持
- 静态的C++结构会在执行中被调用两次,这里是一个C 库实例化顺序所造成的bug。然后,静态
的C++结构在共享库中只被调用一次。
- 静态的结果在一开始就不会被调用,但是在程序退出、结束的时候则会被调用。
- 错误反馈功能很受限制,他们只提供了一些比较普通的错误信息,这些错误信息会让我们很难弄
清楚为什么动态库的加载及连接功能会失效。大多数情况下,错误的主因都是一个丢失的符号。
- 这里有一个bug 会阻止一个建立在第三方的应用程序的共享库。比如,如果你建立了两个文件,
一个是libfoo.so 另一个是libbar.so 在你的应用中,并且在bar/android.mk 文件中将列出的libfoo.so
作为一个独立的libbar.so,如果再加载libbar.so,就会失败,除非你已经在你的进程中加载了
libfoo.so
tonymause 2010-06-12
  • 打赏
  • 举报
回复
顶下 谁来帮忙解决下。。
tonymause 2010-06-12
  • 打赏
  • 举报
回复
自己顶下,拜托了各位大拿。都查了好几天了。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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