Android NDK和dlopen依赖于其他库

时间:2016-10-26 11:32:39

标签: android android-ndk load shared-libraries

我正在尝试直接在android上执行一个简单的C程序。

int main(int argc, char *argv[]) {
    void *Mylib = dlopen("path/to/some/so/library", RTLD_NOW);
    if (!Mylib) {
            fputs (dlerror(), stderr);
            exit(1);
    }
    return 0;
}

我用Android.mk构建这个唱NDK:

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) 
LOCAL_CFLAGS +=-fPIE 
LOCAL_LDFLAGS += -fPIE -pie 
LOCAL_MODULE    := hello 
LOCAL_LDLIBS += -llog -ldl 
include $(BUILD_EXECUTABLE)

但是加载lib后我得到了这个

  

dlopen失败:库“libvendorconn.so”未找到1 |

显然我试图打开的lib需要一个ohter库(libvendorconn.so不知道它在哪里)可能是系统中某处的默认android lib?

有没有办法解决这个问题?如果需要,Pheraps在构建时指示NDK使用系统库?

1 个答案:

答案 0 :(得分:0)

您应该能够dlopen("libvendorconn.so", RTLD_NOW),加载程序会尝试在默认搜索路径中找到它。

Android的旧版本有一个加载程序,需要您按照特定的顺序加载库才能使其正常工作。在Java中,解决此问题的最佳方法是使用ReLinker,但这不会帮助您获得纯本机二进制文件。 NDK发布ndk-depends(显然没有文件记录)可以帮助解决这个问题。