【问题标题】:Android: display popup without a contextAndroid:显示没有上下文的弹出窗口
【发布时间】:2013-03-11 23:48:27
【问题描述】:

我有一个最近发布的 Android 游戏(内置于 cocos2dx),Google 通知我启动崩溃,但以下异常:

java.lang.ExceptionInInitializerError
    at java.lang.Class.newInstanceImpl(Native Method)
    at java.lang.Class.newInstance(Class.java:1409)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3683)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.UnsatisfiedLinkError: Couldn't load game: findLibrary returned null
    at java.lang.Runtime.loadLibrary(Runtime.java:429)
    at java.lang.System.loadLibrary(System.java:554)
    ...

这似乎发生在这种方法中:

static {
    System.loadLibrary("game");
}

我已经进行了一些研究,这似乎是由许多问题造成的,甚至应用程序在安装过程中以某种方式损坏。我想向用户显示一个对话框并要求他们重新下载该应用程序。我可以在 System.loadLibrary 调用周围放置一个 try/catch,但不确定如何在没有上下文的情况下执行任何操作。我想我还没有,因为在我的主 Activity 中调用 onCreate() 之前调用了它。

关于如何通知用户尝试重新下载有什么想法吗?

谢谢!

【问题讨论】:

    标签: android cocos2d-x cocos2d-android


    【解决方案1】:

    为您的dialog 构建另一个Activity。在你的manifest 中为那个Activity 指定

    android:theme="@android:style/Theme.Dialog"
    

    这将使您的Activity 具有Dialog 的外观,但给您更多的灵活性。您可以在此Activity 中使用AlertDialog.Builder 来显示您的Dialog,然后从那里做任何您需要做的事情。您需要Context 才能获得Dialog

    【讨论】:

    • 我是否也必须在代码中实际创建活动?我将如何调用它来调用 AlertDialog.Builder 代码?
    • 如果我理解正确,您希望这是第一个出现的屏幕,对吧?
    • 我遇到的问题是 System.loadLibrary() 调用抛出 UnsatisfiedLinkError 异常(这是可能的)。根据我的阅读,造成这种情况的一个原因是 Google Play 商店的安装损坏/损坏。我想向用户显示一条关于此的消息并将他们重定向到重新安装。
    • 所以,是的,这将是显示的第一个屏幕,但我这里没有上下文。在创建主要活动之前引发此异常。
    • 如果你希望每次都弹出这个,那么我可能会这样做,那么你就会有一个上下文
    【解决方案2】:

    我在更改库名称时遇到了同样的问题。我猜你是在 NDK 下编程。所以在你的CMakeLists.txt 文件中检查你是否有这样的:

    cmake_minimum_required(VERSION 3.4.1)
    project(project_name)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
    ...
    add_library(*game* SHARED gl_code.cpp)
    ...
    target_link_libraries(*game* ...)
    

    PS:没有'*'

    PS2:我不知道 cocos2dx,但我在他们的页面上看到它是 C++,所以你是在原生编程,loadLibrary 中的错误意味着 Java 找不到模块“游戏”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      相关资源
      最近更新 更多