我在Android上遵循了SDL的官方指南,但它没有制作libmain.so

时间:2014-10-05 00:48:29

标签: android eclipse sdl

SDLActivity来电loadLibrary("main"),但它只是libSDL2.so。尽管使用cocos2d-x构建了原生的android应用程序,但我仍然努力实现这一目标并几乎没有Android.mk的经验。是Android.mk我必须调查才能创建这个库吗?我已经安装了DinoMage jni/src/main.c并且在我的包名下有一个SDLActivity存根。

很抱歉没有代码,有很多,无处不在,只有它的位置和Android.mk可能与DinoMage的指南有所不同,DinoMage的指南大致相当于Android提供的自述文件。

我正在使用Eclipse for Windows 7x64

这里是相关的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但我更新了清单,因为注释建议和扩展SDLActivity缺少的libSDL2.so错误再次消失。应用程序从68k增加到872k,但这次在Eclipse中看不到库。现在我仍然需要libmain.so。而且这次我甚至不打算创造main.c。这可能是答案吗?

修改

正确的轨道,我需要main.c,或者可能没有,但无论如何我得到了它,因为应用程序似乎没有做任何事情。

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

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

[armeabi] Compile thumb:main&lt; = main.c
[armeabi] Compile thumb:main&lt; = SDL_android_main.c
在c:/ Users / ME / workspace3 / SDLActivity // jni / src / main / an中包含的文件中 机器人/ SDL_android_main.c:4:0:
C:/用户/ ME / workspace3 / SDLActivity // JNI / SRC /主/机器人/../../ 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

似乎从SDL目录的根目录明确区分了它的main目标与其他更长Android.mk的目标。较长的一个似乎是针对我需要SDL2的另一个库,并且无法构建它,尽管出于同样的原因

[armeabi] Compile thumb:SDL2&lt; = SDL.c
[armeabi] Compile thumb:SDL2&lt; = SDL_android_main.c
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中,而且我发现的方法实际上也是如此。

2 个答案:

答案 0 :(得分: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

这很有效但是接受Ashoke的建议将是最佳的(重新创建 jni / SDL 子文件夹),如果我刚跳过第3页的DinoMage教程,他说“ Put SDL_ttf源目录与项目中的 SDL 目录一起(在jni /中你得到jni / SDL_ttf “我知道。

[armeabi] Compile thumb:SDL2&lt; = SDL_test_md5.c
[armeabi] Compile thumb:SDL2&lt; = SDL_test_random.c
[armeabi] SharedLibrary:libSDL2.so
[armeabi]安装:libSDL2.so =&gt;库/ armeabi / libSDL2.so
[armeabi] Compile thumb:main&lt; = SDL_android_main.c
[armeabi] Compile thumb:main&lt; = main.c
[armeabi] SharedLibrary:libmain.so
[armeabi]安装:libmain.so =&gt; libs / armeabi / libmain.so

DinoMage的演示现在有效。

答案 1 :(得分:0)

在Android.mk中创建名为&#34; main&#34;的共享库模块,您需要声明

LOCAL_MODULE := main

这将导致&#34; libmain.so&#34;文件。

see this example