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中,而且我发现的方法实际上也是如此。
答案 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;文件。