«UnsatisfiedLinkError» появляется, когда «dynamic_cast» используется в Android NDK - PullRequest
4 голосов
/ 27 марта 2012

Я новичок в разработке для Android и столкнулся со следующей проблемой: когда я использую код C ++, который использует «dynamic_cast» выражения - «UnsatisfiedLinkError» появляется, когда я запускаю свое приложение на эмуляторе. Но когда я запускаю приложение без него - все работает нормально (я имею в виду без ошибок в LogCat)

Я пытался запустить его на Android 2.3.3. Я использовал android-ndk-r7b.

My Application.mk:

APP_OPTIM := debug
APP_ABI := armeabi
APP_STL := gnustl_static
APP_MODULES := native_lab

Мой Android.mk:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := native_lab
LOCAL_SRC_FILES := native.cpp enum_if.cpp torrent.cpp
LOCAL_CPP_FEATURES := rtti exceptions
LOCAL_LDLIBS := -llog -lz \
    /home/l/android9_toolchain/arm-linux-androideabi/lib/libstdc++.a
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
include $(BUILD_SHARED_LIBRARY)

Куски кода, которые используют динамическое приведение:

namespace libtorrent 
{
    template <class T>
    T* alert_cast(alert* a)
    {
        return dynamic_cast<T*>(a);
    }
}
.....

using namespace libtorrent;
if (torrent_finished_alert* p = alert_cast<torrent_finished_alert>(a)){}

Бревенчатый кот говорит:

03-27 07:28:26.465: D/dalvikvm(404): Trying to load lib /data/data/com.example/lib/libnative_lab.so 0x405149b8
03-27 07:28:26.496: W/dalvikvm(404): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/example/Bt2Activity;
03-27 07:28:26.555: W/dalvikvm(404): Class init failed in newInstance call (Lcom/example/Bt2Activity;)
03-27 07:28:26.555: D/AndroidRuntime(404): Shutting down VM
03-27 07:28:26.575: W/dalvikvm(404): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-27 07:28:26.615: E/AndroidRuntime(404): FATAL EXCEPTION: main
03-27 07:28:26.615: E/AndroidRuntime(404): java.lang.ExceptionInInitializerError
03-27 07:28:26.615: E/AndroidRuntime(404):  at java.lang.Class.newInstanceImpl(Native Method)

Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

7 голосов
/ 26 апреля 2012

Попробуйте включить эти строки в ваши Applications.mk:

APP_CPPFLAGS += -frtti 
APP_CPPFLAGS += -fexceptions

Есть ли у вас какие-либо методы в Java, помеченные как «нативные»?

0 голосов
/ 27 марта 2012

Вполне возможно, что в эмуляторе может быть ошибка. Если вы можете протестировать ваше приложение без эмулятора, все будет работать нормально. Я думаю, что в эмуляторе есть логическая ошибка, которая создает эту проблему.когда вы вызываете alert_cast (a)) {} ссылка torrent_finished_alert, которую передает uare, не тестируется на эмуляторе, и этот фрагмент кода должен быть закодирован в эмуляторе, то есть операторе динамического приведения.

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