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"文件。
请参阅此示例