Android NDK/JNI: Building a shared library that depends on other shared libraries

后端 未结 3 487
走了就别回头了
走了就别回头了 2021-02-01 06:29

I am writing an android app that wants to make JNI calls into a shared library built in using the NDK. The trick is this shared library calls functions provided by OTHER shared

3条回答
  •  余生分开走
    2021-02-01 07:22

    Your problem is with the naming convention. NDK and Android insist on the shared library names to always begin with lib. Otherwise, the libraries will not be linked properly, and not copied to the libs/armeabi folder properly, and not installed on the device (copied to /data/data/package/lib directory properly.

    If you rename support_lib1.so to libsupport_1.so and support_lib2.so to libsupport_2.so, and put these two files in jni/lib directory, then your Attempt #5 will work with minor change:

    LOCAL_PATH := $(call my-dir)
    
    #get support_lib1
    include $(CLEAR_VARS)
    LOCAL_MODULE           := support_lib1
    LOCAL_SRC_FILES        := lib/libsupport_1.so
    include $(PREBUILT_SHARED_LIBRARY)
    
    #get support_lib2
    include $(CLEAR_VARS)
    LOCAL_MODULE           := support_lib2
    LOCAL_SRC_FILES        := lib/libsupport_2.so
    include $(PREBUILT_SHARED_LIBRARY)
    
    #build native lib
    include $(CLEAR_VARS)    
    LOCAL_MODULE           := native_lib
    LOCAL_SRC_FILES        := native_lib.cpp
    
    LOCAL_LDLIBS := -L$(SYSROOT)/../usr/lib -llog
    LOCAL_SHARED_LIBRARIES := support_lib1 support_lib2
    
    include $(BUILD_SHARED_LIBRARY)
    

    BTW, I don't think you need this -L$(SYSROOT)/../usr/lib.

    PS Don't forget to update the Java side, too:

    static {
        System.loadLibrary("support_lib1");
        System.loadLibrary("support_lib2");
        System.loadLibrary("native_lib");
    }
    

提交回复
热议问题