【问题标题】:I've followed official guides to SDL on Android but its not making libmain.so我在 Android 上遵循了 SDL 的官方指南,但它没有制作 libmain.so
【发布时间】:2014-10-18 18:10:40
【问题描述】:

SDLActivity 调用loadLibrary("main") 但它只是libSDL2.so 那里。尽管我已经使用 cocos2d-x 构建了原生 android 应用程序,但我仍然很难走到这一步,并且几乎没有使用 Android.mk 的经验。是Android.mk 我必须调查才能创建这个库吗?我有 DinoMage 的 jni/src/main.c 并在我的包名下有一个扩展 SDLActivity 的存根。

抱歉没有代码,到处都有很多,只是它的位置和Android.mk 可能与 DinoMage 的指南有所不同,这与提供的 Android 自述文件很接近。

我正在使用适用于 Windows 7x64 的 Eclipse

这里是相关的logcat:

10-05 01:11:14.623: W/dalvikvm(3903): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/libsdl/app/SDLActivity;
10-05 01:11:14.623: W/dalvikvm(3903): Class init failed in newInstance call (Lmydomain/myproject/myactivity;)
10-05 01:11:56.760: D/AndroidRuntime(3903): Shutting down VM
10-05 01:11:56.761: W/dalvikvm(3903): threadid=1: thread exiting with uncaught exception (group=0x414bd908)
10-05 01:11:56.783: E/AndroidRuntime(3903): FATAL EXCEPTION: main
10-05 01:11:56.783: E/AndroidRuntime(3903): java.lang.ExceptionInInitializerError
10-05 01:11:56.783: E/AndroidRuntime(3903):     at java.lang.Class.newInstanceImpl(Native Method)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at java.lang.Class.newInstance(Class.java:1319)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2104)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2216)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at android.app.ActivityThread.access$600(ActivityThread.java:149)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at android.os.Looper.loop(Looper.java:153)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at android.app.ActivityThread.main(ActivityThread.java:5022)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at java.lang.reflect.Method.invokeNative(Native Method)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at java.lang.reflect.Method.invoke(Method.java:511)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1032)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:790)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at dalvik.system.NativeStart.main(Native Method)
10-05 01:11:56.783: E/AndroidRuntime(3903): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load main: findLibrary returned null
10-05 01:11:56.783: E/AndroidRuntime(3903):     at java.lang.Runtime.loadLibrary(Runtime.java:365)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at java.lang.System.loadLibrary(System.java:535)
10-05 01:11:56.783: E/AndroidRuntime(3903):     at org.libsdl.app.SDLActivity.<clinit>(SDLActivity.java:54)
10-05 01:11:56.783: E/AndroidRuntime(3903):     ... 15 more

我再次尝试使用不同的方法导入现有代码(从提取位置复制到工作区)并将其设置为再次出现相同的错误。有一段时间我错过了 libSDL2.so,但我按照 cmets 的建议更新了清单,并扩展了 SDLActivity,丢失的 libSDL2.so 错误又消失了。应用程序从 68k 变为 872k,但这次库在 Eclipse 中不可见。现在我仍然需要 libmain.so。而这次我什至还没有费心创建main.c。这就是答案吗?

编辑

正确的轨道,我需要 main.c,或者可能不需要,但我还是得到了它,因为该应用似乎没有做任何其他事情。

说到不做任何事情,Eclipse 似乎愿意在我的手机上运行任何旧球。我需要运行 ndk-build(按照 ndk 文档中的建议),然后我得到更多错误,但至少它们是编译时间。

一个与 DinoMage 建议的重要区别在于将解压缩的 SDL 批量复制到我的新项目中。它将覆盖Android.mk。我一直在玩不同的版本,project-android 文件夹附带的版本:

[armeabi] 编译 thumb : main [armeabi] 编译拇指:main 在 c:/Users/ME/workspace3/SDLActivity//jni/src/main/an 包含的文件中 机器人/SDL_android_main.c:4:0:
c:/Users/ME/workspace3/SDLActivity//jni/src/main/android/../../SDL_intern al.h:34:24:致命错误:SDL_config.h:没有这样的文件或目录
编译终止。
make.exe: *** [c:/Users/ME/workspace3/SDLActivity//obj/local/armeabi/objs /main/main/android/SDL_android_main.o] 错误 1 ​​

这似乎将main 目标与另一个更长的Android.mk 目标明确区分开来,来自SDL 目录的根目录。较长的似乎针对我需要的另一个库SDL2,但由于同样的原因,未能构建到该库

[armeabi] 编译拇指:SDL2 [armeabi] 编译拇指:SDL2 c:/Users/ME/workspace3/SDLActivity//jni/src/SDL_android_main.c:4:32: fata l 错误:../../SDL_internal.h:没有这样的文件或目录
编译终止。
make.exe: *** [c:/Users/ME/workspace3/SDLActivity//obj/local/armeabi/objs /SDL2/src/SDL_android_main.o] 错误 1 ​​

我已经完成了这些包含并更正了一些,但我不想深入修改所谓的库代码。

出于习惯和让事情更好地工作,我将子文件夹jni/src中的Android.mk编辑为

LOCAL_SRC_FILES :=  main.c \
                    main/android/SDL_android_main.c

来自模板

LOCAL_SRC_FILES := main.c \
                    $(SDL_PATH)/src/main/android/SDL_android_main.c

整个jni/src/Android.mk 现在是:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
SDL_PATH := ../SDL

LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include

# Add your application source files here...
LOCAL_SRC_FILES :=  main.c \
                    main/android/SDL_android_main.c

LOCAL_SHARED_LIBRARIES := SDL2
LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog
include $(BUILD_SHARED_LIBRARY)

我认为我的路径搞砸了,但是有太多不同的方法可以将这段代码导入 Eclipse,而且我只发现了太多的方法。

【问题讨论】:

    标签: android eclipse sdl


    【解决方案1】:

    一个肮脏的黑客会改变

    SDL_PATH := ../SDL
    

    SDL_PATH := ../jni
    

    因为我们被告知要粘贴它,"Then copy (or symlink) the whole SDL directory and put it into your project’s jni directory"

    这让 ndk-build 运行了一段时间,直到找不到 EGL!它永远不可能,是时候提出另一个问题,或者放弃:

    Android NDK: WARNING: Ignoring unknown import directory: "C:\Users\ME\workspace3\SDLActivity\jni\src"
    [armeabi] Compile thumb  : SDL2 <= SDL.c
    [armeabi] Compile thumb  : SDL2 <= SDL_android_main.c
    [armeabi] Compile thumb  : SDL2 <= SDL_assert.c
    [armeabi] Compile thumb  : SDL2 <= SDL_error.c
    [armeabi] Compile thumb  : SDL2 <= SDL_hints.c
    [armeabi] Compile thumb  : SDL2 <= SDL_log.c
    [armeabi] Compile thumb  : SDL2 <= main.c
    [armeabi] Compile thumb  : SDL2 <= SDL_audio.c
    [armeabi] Compile thumb  : SDL2 <= SDL_audiocvt.c
    [armeabi] Compile thumb  : SDL2 <= SDL_audiodev.c
    [armeabi] Compile thumb  : SDL2 <= SDL_audiotypecvt.c
    [armeabi] Compile thumb  : SDL2 <= SDL_mixer.c
    [armeabi] Compile thumb  : SDL2 <= SDL_wave.c
    [armeabi] Compile thumb  : SDL2 <= SDL_androidaudio.c
    In file included from c:/Users/ME/workspace3/SDLActivity//jni/src/audio/a
    ndroid/SDL_androidaudio.c:31:0:
    c:/Users/ME/workspace3/SDLActivity//jni/src/audio/android/../../core/andr
    oid/SDL_android.h:30:29: fatal error: EGL/eglplatform.h: No such file or directo
    ry
    compilation terminated.
    make.exe: *** [c:/Users/ME/workspace3/SDLActivity//obj/local/armeabi/objs
    /SDL2/src/audio/android/SDL_androidaudio.o] Error 1
    

    其余的解决方案来自http://blog.csdn.net/jwzhangjie/article/details/9083827 即在jni目录下创建Application.mk指定

    APP_PLATFORM := android-9

    这可行,但如果我只是跳到 DinoMage 教程的第 3 页,他指出“Put项目中 SDL 目录旁边的 SDL_ttf 源目录(在 jni/ 中,所以你得到 jni/SDL_ttf”我知道。

    [armeabi] 编译拇指:SDL2 [armeabi] 编译拇指:SDL2 [armeabi] SharedLibrary : libSDL2.so
    [armeabi] 安装:libSDL2.so => libs/armeabi/libSDL2.so
    [armeabi] 编译拇指:main [armeabi] 编译 thumb : main [armeabi] SharedLibrary : libmain.so
    [armeabi] 安装:libmain.so => libs/armeabi/libmain.so

    DinoMage 的演示现在可以运行了。

    【讨论】:

      【解决方案2】:

      要创建一个名为“main”的共享库模块,您需要在 Android.mk 中声明

      LOCAL_MODULE := main
      

      这将产生“libmain.so”文件。

      see this example

      【讨论】:

      • 打开命令提示符,cd 到包含“jni”目录的文件夹(不要将cd 放入 jni),运行ndk-build clean &amp; ndk-build,请使用输出更新您的问题。
      • 不知道Android-static.mk是否默认由ndk-build运行?如果我将那个复制粘贴到Android.mk 我得到Android NDK: pathToMk.mk: Cannot find module with tag 'SDL' in import path .. are you sure your NDK_MODULE_PATH variable is properly defined. It isn't showing up in set`,到目前为止没有人提到它...谢谢
      • 是你的“android-project”folder inside "SDL" parent folder 吗?如果是,在SDL 文件夹中运行ndk-build 命令
      • 不,它在 jni 文件夹中,按照 DinoMage 的说明。抱歉页面拒绝正确更新延迟,我刚刚准备了一个临时答案,但无法提交。请随时以我的回答为基础,否则问题需要改变。嗯,在源代码中从来没有一个 SDL 文件夹,它被称为 SDL2-2.0.3 也许我应该将 那个 文件夹复制到 jni 并将其重命名为 SDL
      • 是的,只需将文件夹 SDL2-2.0.3 复制并重命名为 SDL 到“jni”文件夹中。还有你的Android.mk needs to refer to SDL as static as shown in this android.mk
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多