Может ли разделяемая библиотека вызывать другую разделяемую библиотеку? - PullRequest
7 голосов
/ 18 мая 2011

Может ли одна общая библиотека загружать и вызывать функции из другой общей библиотеки?

У меня есть общая библиотека libDsmTestLib.so , которая использует другие общие библиотеки libDsmShared.so и libPINDsmShared.so

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE           := DsmTestLib
LOCAL_SRC_FILES        := DSM_Library.cpp

LOCAL_LDLIBS := -lDsmShared
LOCAL_LDLIBS += -lPINDsmShared

include $(BUILD_SHARED_LIBRARY)

когда я создаю libDsmTestLib.so и хочу использовать его в моем java-приложении для Android, например:

package com.dsm;

import android.app.Activity;
import android.os.Bundle;

public class dsmTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    static {
        try {
            System.loadLibrary("DsmTestLib");
        }
        catch( UnsatisfiedLinkError e ) {
             System.err.println("Native code library failed to load.\n" + e);
        }
    }  
}

В блоке catch я получаю ошибку

Невозможно загрузить библиотеку: link_image [1962]: 33 не удалось загрузить нужную библиотеку 'libDsmShared.so' для 'LibDsmTestLib.so' (load_library [1104]: библиотека 'libDsmShared.so' не найден)

Функция Loadlibrary не может найти библиотеку libDsmShared.so , которая использует мою основную библиотеку libDsmTestLib.so , Кто может сказать, почему? и что я могу сделать, чтобы решить эту проблему?


Дополнительная информация

У меня была статическая библиотека (.so, написанная на C ++) с функциональностью, которую я хочу использовать в своем приложении Java для Android, для этого я создаю файлы .cpp и .h, в которых я вызываю функцию из ранее созданной библиотеки.

Ответы [ 7 ]

7 голосов
/ 14 сентября 2011

Я нашел решение таким образом - расширенная загрузка библиотек:

    static {
    try {
        System.loadLibrary("DsmShared");
        System.loadLibrary("DsmTestLib");
    }
    catch( UnsatisfiedLinkError e ) {
         System.err.println("Native code library failed to load.\n" + e);
    }
} 
2 голосов
/ 23 ноября 2011

Должно быть:

LOCAL_LDLIBS += -L$(LOCAL_PATH)/libs/
LOCAL_LDLIBS += -lutils

Также не забудьте скопировать libutils.so в папку libs/armeabi

2 голосов
/ 27 октября 2011

У меня была такая же ошибка. Вот как я решил, и, возможно, вам стоит попробовать этот метод.

LOCAL_LDLIBS += -L$(LOCAL_PATH)/libs/libutils.so

1 голос
/ 18 ноября 2014

К вашему сведению, я только что после долгой сессии отладки обнаружил, что порядок загрузки lib имеет значение.

    System.loadLibrary("libDsmShared");
    System.loadLibrary("libPINDsmShared");
    System.loadLibrary("DsmTestLib");
1 голос
/ 30 августа 2011

Нет, Android VM будет искать файл so в своих собственных файловых системах, но не в папке, как [C:/cygwin/home/android-ndk-r5b/samples/testingDsm/lib] (я думаю).

Он будет искать его из @androidvm:/system или другогопапки, указанные в java.library.path.

0 голосов
/ 11 января 2012
  1. Во-первых, ваша активность должна загрузить все общие библиотеки

    static {
        try {
            System.loadLibrary("libDsmShared");
            System.loadLibrary("libPINDsmShared");
            System.loadLibrary("DsmTestLib");
        }
        catch( UnsatisfiedLinkError e ) {
            System.err.println("Native code library failed to load.\n" + e);
        }
    }
    
  2. Включите "lib * .so" при компиляции собственного кода (в Android.mk), как в

    ...
    LOCAL_LDLIBS := -L/cygdrive/home/android-ndk-r5b/samples/testingDsm/lib/libDsmShared -lDsmShared
    LOCAL_LDLIBS += -L/cygdrive/home/android-ndk-r5b/samples/testingDsm/lib/libPINDsmShared -lPINDsmShared
    ...
    
0 голосов
/ 18 мая 2011

Я нашел это и протестировал :

В динамическом компоновщике Android была ошибка, из-за которой это не работало, но, как мне кажется, она была исправлена ​​в 1.6.Если вы используете NDK, используйте "LOCAL_SHARED_LIBRARIES: = libB libC" при определении модуля libA.Это предполагает, что libB и libC также являются модулями NDK, которые были сгенерированы с помощью NDK.

In case libB.so and libC.so are not generated with the NDK, you should do
the following:
  • в определении модуля libA, используйте LOCAL_LDLIBS + = / full / path / to / libB.so /full/path/to/libC.so это гарантирует, что правильный экспорт символов будет сгенерирован в libA.so

  • , вручную скопируйте libB.so и libC.so в $ APP_PROJECT / libs/ armeabi перед сборкой .apk, это гарантирует, что он будет скопирован в / data / data // lib во время установки менеджером пакетов.

теперь Android.mk выглядит так:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE           := DsmTestLib
LOCAL_SRC_FILES        := DSM_Library.cpp


#LOCAL_SHARED_LIBRARIES := DsmShared
#LOCAL_SHARED_LIBRARIES += PINDsmShared


# Set local libs with full path.                                                                
LOCAL_LDLIBS := C:/cygwin/home/android-ndk-r5b/samples/testingDsm/lib/libDsmShared.so           
LOCAL_LDLIBS += C:/cygwin/home/android-ndk-r5b/samples/testingDsm/lib/libPINDsmShared.so        

include $(BUILD_SHARED_LIBRARY)

, но теперь ошибка

Невозможно загрузить библиотеку: link_image [1962]: 33 не удалось загрузить необходимую библиотеку 'C: / cygwin / home / android-ndk-r5b/samples/testingDsm/lib/libDsmShared.so 'для' libDsmTestLib.so '(load_library [1104]: библиотека' C: /cygwin/home/android-ndk-r5b/samples/testingDsm/lib/libDsmShared.so 'не найдена)

произошло, но когда я проверяю C: /cygwin/home/android-ndk-r5b/samples/testingDsm/lib/libDsmShared.so tПо его пути я обнаружил, что там есть библиотека ... Что за метр?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...