【发布时间】: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,而且我只发现了太多的方法。
【问题讨论】: