【问题标题】:Error launching Android NDK app启动 Android NDK 应用程序时出错
【发布时间】:2011-10-17 05:07:21
【问题描述】:

我编写了一个在启动时崩溃的 NativeActivity,因为(我的理论......)我在命名共享库或模块或 AndroidManifest.xml 中的某些内容时做错了。下面是我的应用程序启动时 LogCat 的输出,以及我的清单文件的内容。

有什么我在设置时出错的想法吗?

谢谢, 阿尔法

===================清单=========================== ===================

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.Mythica.SpiderGame"
        android:versionCode="1"
        android:versionName="1.0">

    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="12" />

    <!-- This .apk has no Java code itself, so set hasCode to false. -->
    <application android:label="@string/app_name" android:hasCode="false">

        <!-- Our activity is the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->
        <activity android:name="android.app.NativeActivity"
                android:label="@string/app_name"
                android:configChanges="orientation|keyboardHidden">
            <!-- Tell NativeActivity the name of or .so -->
            <meta-data android:name="android.app.lib_name"
                    android:value="SpiderGame" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
<!-- END_INCLUDE(manifest) -->

====================LOGCAT 输出========================== ====================

07-31 23:13:11.770: WARN/dalvikvm(1384): threadid=1: 线程以未捕获的异常退出 (group=0x4016d760) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 致命异常: main 07-31 23:13:11.780: 错误/AndroidRuntime(1384): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.Mythica.SpiderGame/android.app.NativeActivity}: java.lang.IllegalArgumentException: 无法加载原生库:/data/data/com.Mythica.SpiderGame/lib/libSpiderGame.so 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1751) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 android.app.ActivityThread.access$1500(ActivityThread.java:122) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 android.os.Handler.dispatchMessage(Handler.java:99) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 android.os.Looper.loop(Looper.java:132) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 android.app.ActivityThread.main(ActivityThread.java:4028) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 java.lang.reflect.Method.invokeNative(Native Method) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 java.lang.reflect.Method.invoke(Method.java:491) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 07-31 23:13:11.780:错误/AndroidRuntime(1384):在 dalvik.system.NativeStart.main(本机方法) 07-31 23:13:11.780:错误/AndroidRuntime(1384):原因:java.lang.IllegalArgumentException:无法加载本机库:/data/data/com.Mythica.SpiderGame/lib/libSpiderGame.so 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 android.app.NativeActivity.onCreate(NativeActivity.java:199) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715) 07-31 23:13:11.780: 错误/AndroidRuntime(1384): ... 11 更多 07-31 23:13:11.780: WARN/ActivityManager(288): 强制完成活动 com.Mythica.SpiderGame/android.app.NativeActivity 07-31 23:13:11.800: 错误/android.os.Debug(288): Dumpstate > /data/log/dumpstate_app_error

【问题讨论】:

  • 你的 .so 在哪里?你的设备支持 NativeActivity 吗?
  • 我认为我的 .so 作为依赖项内置于 .apk 中,但这种假设一定是无效的。设备支持 NativeActivity。

标签: android-ndk android-manifest native-activity


【解决方案1】:

结果我的问题的解决方案是将我的游戏库构建为静态对象而不是共享对象。 MyApp 引用 MyLibrary.so,我猜想共享库必须在运行前手动复制到设备上,尽管我没有通过这样做来测试该理论,因为静态链接正在完成这项工作。

如果我是正确的,那么错误的假设是认为我自己的任何共享库都将内置到我的 .apk 中,就像内置 NativeActivity 一样。

【讨论】:

    【解决方案2】:

    您应该阅读 NDK 中的 docs/PREBUILTS.html。您可以在 Android.mk 文件中添加如下所示的部分:

    #
    # Include prebuilt shared library
    #
    include $(CLEAR_VARS)
    LOCAL_MODULE := MyLibrary-prebuilt
    LOCAL_SRC_FILES := relative/path/to/MyLibrary.so
    LOCAL_EXPORT_C_INCLUDES := relative/path/to/includes
    include $(PREBUILT_SHARED_LIBRARY)
    

    然后在您在 Android.mk 末尾调用 BUILD_SHARED_LIBRARY 之前,您输入以下内容:

    LOCAL_SHARED_LIBRARIES := MyLibrary-prebuilt
    

    这是假设您以某种方式设法在 ndk 构建系统之外为 ARM 交叉编译了您的库。如果您想从 ndk-build 中构建您的共享库,您可以按照为您的原生活动构建 .so 的方式进行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      相关资源
      最近更新 更多