在Android NDK中使用“dynamic_cast”时会出现“UnsatisfiedLinkError”

时间:2012-03-26 22:52:01

标签: android c++ dynamic android-ndk dynamic-cast

我是Android的新手,我遇到了下一个问题: 当我使用C ++代码时,使用" dynamic_cast" 表达式 - "当我在模拟器上启动应用程序时,会出现UnsatisfiedLinkError" 。但是当我没有它运行应用程序时 - 一切正常(我的意思是LogCat没有任何错误)

我试图在Android 2.3.3上运行它。我使用了android-ndk-r7b。

我的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)){}

Log cat说:

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 个答案:

答案 0 :(得分:7)

尝试将这些行包含在您的Applications.mk中:

APP_CPPFLAGS += -frtti 
APP_CPPFLAGS += -fexceptions

您是否将Java中的任何方法标记为“本机”?

答案 1 :(得分:0)

很有可能在模拟器中可能存在错误。如果你可以在没有模拟器的情况下测试你的应用程序,那么就可以正常工作。我认为模拟器中存在一些逻辑错误会产生这个问题。当你调用alert_cast(a)){} uare传递的引用torrent_finished_alert在模拟器上是不可测试的,这段代码必须在模拟器中编码,即动态强制转换操作符。