我已经遵循了Android上的SDL官方指南,但它并没有 libmain.so



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

很抱歉没有代码,到处都是,只有它的位置和Android.mk可能与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.,所以我按照注释的建议更新了清单,并扩展了SDLActivity缺少的libSDL2.所以错误再次消失。应用程序从68k增加到872k,但这次库在Eclipse中不可见。现在我仍然需要libmain.so,而且这次我甚至还没有费心创建main.c。这就是答案吗?

编辑

没错,我需要main.c,也许不需要,但我还是得到了,因为这个应用程序似乎没有做任何其他事情。

说到什么都不做,Eclipse似乎愿意在我的手机上运行任何旧球。我需要运行ndk构建(正如ndk文档中所建议的),然后我会得到,呃,更多的错误,但至少它们是编译时的。

DinoMage建议的一个重要区别是将解压缩的SDL大规模复制到我的新项目中。它将覆盖Android.mk。我一直在玩不同的版本,android文件夹产生的项目附带的版本:

[armabi]编译thumb:main<=main.c
[armabi]编译thumb:main<=SDL_android_main.c
在c:\Users/ME/workspace3/SDLActivity//jni/src/main/a中包含的文件中droid/SDL_android_main.c:4:0:
c:/Users/ME/workspace3/SDLActivity//jni/src/main/android/..//SDL_internal.h:34:24:致命错误:SDL_config.h:没有这样的文件或目录
编译终止
make.exe:***[c:/Users/ME/workspace3/SDLActivity//obj/local/armabi/objs/main/main/android/SDL_android_main.o]错误1

这似乎明确区分了它的main目标与其他更长的Android.mk,即SDL目录的根。较长的一个似乎是针对我需要的SDL2的另一个库,但未能将其构建为,尽管原因与完全相同

[armabi]编译thumb:SDL2<=SDL.c
[armabi]编译thumb:SDL2<=SDL_android_main.c
c:/Users/ME/workspace3/SDLActivity//jni/src/SDL_android_main.c:4:32:fatal错误:..//SDL_internal.h:没有这样的文件或目录
编译终止
make.exe:***[c:/Users/ME/workspace3/SDLActivity//obj/local/armabi/objs/SDL2/src/SDL_android_main.o]错误1

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

出于习惯和更好地工作,我将子文件夹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,我只找到了太多工作的方法。

一个肮脏的黑客会改变

SDL_PATH := ../SDL

SDL_PATH := ../jni

因为这是我们被告知粘贴它的地方,"然后复制(或符号链接)整个SDL目录,并将其放入项目的jni目录"

这使得ndk构建缓慢进行了一段时间,直到找不到EGL!它永远都做不到,是时候提出另一个问题了,或者放弃了:

Android NDK: WARNING: Ignoring unknown import directory: "C:UsersMEworkspace3SDLActivityjnisrc"
[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页,他说"在你的项目中,把SDL_ttf源目录放在你的SDL目录旁边(在jni/中,所以你得到了jni/SDL_ttf",那么接受Ashoke的建议将是最佳的(重新创建jni/SDL子文件夹)。

[armabi]编译thumb:SDL2<=SDL_test_md5.c
[armabi]编译thumb:SDL2<=SDL_test_random.c
[armabi]共享库:libSDL2.so
[armabi]安装:libSDL2.so=>libs/armabi/libSDL2.so
[armabi]编译thumb:main<=SDL_android_main.c
[armabi]编译thumb:main<=main.c
[armabi]共享库:libmain.so
[armabi]安装:libmain.so=>libs/armabi/libmain.so

DinoMage的演示现在可以工作了。

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

LOCAL_MODULE := main

这将产生"libmain.so"文件。

请参阅此示例

相关内容

最新更新