我跟着SDL正式的导游在Android上,但它不是做libmain.so [英] I've followed official guides to SDL on Android but its not making libmain.so

查看:774
本文介绍了我跟着SDL正式的导游在Android上,但它不是做libmain.so的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

SDLActivity 要求调用LoadLibrary(主),但它只是 libSDL2.so 那里。据我挣扎得到这个,而且几乎没有用,尽管cocos2d的-X具有内置原生Android应用程序 Android.mk 的经验。它是 Android.mk 我必须调查创建这个图书馆?我有DinoMage的在 JNI / src目录/ main.c中并延长 SDLActivity 在我的包名存根

对不起,没有code,还有很多,无处不在,只是它的位置和 Android.mk 可从DinoMage指南,这近似于为Android提供的自述不同反正。

我使用Eclipse为Windows 7x64

下面是有关的logcat的:

  1月10日至五日:11:146.23:W / dalvikvm(3903):异常Ljava /朗/的UnsatisfiedLinkError;扔在初始化Lorg / libsdl /应用/ SDLActivity;
一月10日至5日:11:146.23:W / dalvikvm(3903):初始化类的newInstance中调用失败(Lmydomain / myproject的/ myactivity;)
一月10日至5日:11:56.760:D / AndroidRuntime(3903):关闭VM
一月10日至5日:11:56.761:W / dalvikvm(3903):主题ID = 1:螺纹未捕获的异常退出(组= 0x414bd908)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):致命异常:主要
一月10日至5日:11:56.783:E / AndroidRuntime(3903):java.lang.ExceptionInInitializerError
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在java.lang.Class.newInstanceImpl(本机方法)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在java.lang.Class.newInstance(Class.java:1319)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在android.app.Instrumentation.newActivity(Instrumentation.java:1053)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2104)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2216)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在android.app.ActivityThread.access $ 600(ActivityThread.java:149)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1305)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在android.os.Handler.dispatchMessage(Handler.java:99)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在android.os.Looper.loop(Looper.java:153)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在android.app.ActivityThread.main(ActivityThread.java:5022)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在java.lang.reflect.Method.invokeNative(本机方法)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在java.lang.reflect.Method.invoke(Method.java:511)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1032)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:790)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在dalvik.system.NativeStart.main(本机方法)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):因:java.lang.UnsatisfiedLinkError中:无法加载主:findLibrary返回null
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在java.lang.Runtime.loadLibrary(Runtime.java:365)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在java.lang.System.loadLibrary(System.java:535)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):在org.libsdl.app.SDLActivity< clinit>(SDLActivity.java:54)
一月10日至5日:11:56.783:E / AndroidRuntime(3903):15 ...更多

我已经试过这再次使用导入现有code(复制到从提取位置工作区),并再次将它设置为得到相同的错误,不同的方法。有一段时间我错过libSDL2.so但我更新了明显的意见建议和扩展SDLActivity缺少libSDL2.so错误再次消失了。从应用程序68K到872k,但这次的库是不可见在Eclipse中。现在,我还需要libmain.so。而我还没有打扰创建的main.c 这个时候,还没有。难道这是答案?

修改

正轨,我需要main.c中,也许没有,但我得到了它作为反正应用程序不会出现,否则做任何事情。

中没有做任何的Eclipse似乎愿意到我的手机上运行的任何旧球说起。我需要运行NDK的构建(如劝NDK文档),然后我得到的,呃,更多的错误,但至少他们的编译时间。

重要DinoMage的意见差异自带的复制批发市场在解压缩后的SDL我的新项目。它会覆盖 Android.mk 。我一直在玩弄不同的版本,里面传来的项目android文件夹,一个生产:

[armeabi]编译拇指:主< = main.c中结果
[armeabi]编译拇指:主< = SDL_android_main.c结果
在文件从C包括:/用户/ ME / workspace3 / SDLActivity // JNI / src目录/主/一个
机器人/ SDL_android_main.c:4:0:结果
C:/用户/ ME / workspace3 / SDLActivity // JNI / src目录/主/ Android的/../../ SDL_intern
al.h:34:24:致命错误:SDL_config.h:没有这样的文件或目录结果
编译终止。结果
的make.exe:*** [C:/用户/ ME / workspace3 / SDLActivity // OBJ /本地/ armeabi / OBJ文件
/main/main/android/SDL_android_main.o]错误1

这似乎明确区分它的从目标等更长的时间 Android.mk ,从根SDL的目录。在较长的一个似乎瞄准其他图书馆,我需要 SDL2 ,并没有构建到,虽然同样的原因

[armeabi]编译大拇指:SDL2< = SDL.c结果
[armeabi]编译大拇指:SDL2< = 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:/用户/ ME / workspace3 / SDLActivity // OBJ /本地/ armeabi / OBJ文件
/SDL2/src/SDL_android_main.o]错误1

我经历过这些,包括纠正和一对夫妇,但我不想陷入太深修改所谓的的库code。

出于习惯,并把事情更好的工作,我编辑Android.mk子文件夹 JNI / src目录

  LOCAL_SRC_FILES:= main.c中\\
                    主/安卓/ SDL_android_main.c

从模板

  LOCAL_SRC_FILES:= main.c中\\
                    $(SDL_PATH)/src/main/android/SDL_android_main.c

整个 JNI / src目录/ Android.mk 现在是:

  LOCAL_PATH:= $(叫我-DIR)
包括$(CLEAR_VARS)
LOCAL_MODULE:=主
SDL_PATH:= ../SDLLOCAL_C_INCLUDES:= $(LOCAL_PATH)/ $(SDL_PATH)/包括:#在这里添加您的应用程序源文件...
LOCAL_SRC_FILES:= main.c中\\
                    主/安卓/ SDL_android_main.cLOCAL_SHARED_LIBRARIES:= SDL2
LOCAL_LDLIBS:= -lGLESv1_CM -lGLESv2 -llog
包括$(BUILD_SHARED_LIBRARY)

我想我的路径都搞砸了,但有太多不同的方式来导入此code到Eclipse和我只发现工作,即使这么多。

太方法
解决方案

一个肮脏的黑客将被改变。

  SDL_PATH:= ../SDL

  SDL_PATH:= ../jni

,因为这是我们被告知通过将其粘贴,然后复制(或符号连接)整个SDL目录,并把它放到你的项目的JNI目录

这被NDK的构建沿隆隆的一段时间,直到没有找到EGL!它永远不能,时刻为另一个问题,或放弃:


 的Andr​​oid NDK:警告:忽略未知的进口目录C:\\用户\\ ME \\ workspace3 \\ SDLActivity \\ JNI的\\ src
[armeabi]编译大拇指:SDL2< = SDL.c
[armeabi]编译大拇指:SDL2< = SDL_android_main.c
[armeabi]编译大拇指:SDL2< = SDL_assert.c
[armeabi]编译大拇指:SDL2< = SDL_error.c
[armeabi]编译大拇指:SDL2< = SDL_hints.c
[armeabi]编译大拇指:SDL2< = SDL_log.c
[armeabi]编译大拇指:SDL2< = main.c中
[armeabi]编译大拇指:SDL2< = SDL_audio.c
[armeabi]编译大拇指:SDL2< = SDL_audiocvt.c
[armeabi]编译大拇指:SDL2< = SDL_audiodev.c
[armeabi]编译大拇指:SDL2< = SDL_audiotypecvt.c
[armeabi]编译大拇指:SDL2< = SDL_mixer.c
[armeabi]编译大拇指:SDL2< = SDL_wave.c
[armeabi]编译大拇指:SDL2< = SDL_androidaudio.c
在文件从C包括:/用户/ ME / workspace3 / SDLActivity // JNI / src目录/音频/ A
ndroid / SDL_androidaudio.c:31:0:
C:/用户/ ME / workspace3 / SDLActivity // JNI / src目录/音频/ Android的核心/../../ /安德烈
OID / SDL_android.h:30:29:致命错误:EGL / eglplatform.h:没有这样的文件或DIRECTO
RY
编译终止。
的make.exe:*** [C:/用户/ ME / workspace3 / SDLActivity // OBJ /本地/ armeabi / OBJ文件
/SDL2/src/audio/android/SDL_androidaudio.o]错误1


该解决方案的其余部分来自 http://blog.csdn.net/jwzhangjie /条/信息/ 9083827
即JNI目录中创建 Application.mk 来指定

APP_PLATFORM:= Android的9

这工作,但考虑Ashoke的意见将是最佳的(再创造的 JNI / SDL 的子文件夹),如果我只是跳过第3页DinoMage的教程,他指出:把在SDL_ttf源目录旁边您的 SDL 目录项目(在JNI /等你拿JNI / SDL_ttf 的我想知道。

[armeabi]编译大拇指:SDL2< = SDL_test_md5.c结果
[armeabi]编译大拇指:SDL2< = SDL_test_random.c结果
[armeabi] SharedLibrary:libSDL2.so结果
[armeabi]安装:libSDL2.so =>​​库/ armeabi / libSDL2.so结果
[armeabi]编译拇指:主< = SDL_android_main.c结果
[armeabi]编译拇指:主< = main.c中结果
[armeabi] SharedLibrary:libmain.so结果
[armeabi]安装:libmain.so =>​​库/ armeabi / libmain.so

这DinoMage演示现在的作品。

SDLActivity calls loadLibrary("main") but it's just libSDL2.so there. I struggled getting this far and have almost no experience of Android.mk, despite having built native android applications with cocos2d-x. Is it Android.mk I must investigate to create this library? I've got DinoMage's jni/src/main.c in place and have a stub extending SDLActivity under my package name.

Sorry for no code, there's lots, everywhere, only it's location and Android.mk could differ from DinoMage's guide, which approximates to the supplied readme for android anyway.

I'm using Eclipse for Windows 7x64

Here's the relevant 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

I've tried this again using a different method of importing existing code (copied into workspace from extraction location) and set it up to get the same error, again. For a while I was missing libSDL2.so but I updated the manifest as the comments suggested and extended SDLActivity the missing libSDL2.so error was gone again. App went from 68k to 872k but this time the library is not visible within Eclipse. Now I still need libmain.so. and I haven't even bothered creating main.c this time, yet. Could this be the answer?

edit

Right track, I need main.c, or maybe not, but I got it anyway as the app doesn't appear to do anything otherwise.

Speaking of not doing anything Eclipse appears willing to run any old balls on my phone. I need to run ndk-build (as advised in the ndk documentation) and then I get, er, more errors, but at least they're compile time.

One important difference to DinoMage's advice comes with the wholesale copying over of the unzipped SDL to my new project. It will overwrite Android.mk. I've been playing around with different versions, the one which came with the project-android folder produces:

[armeabi] Compile thumb : main <= main.c
[armeabi] Compile thumb : main <= SDL_android_main.c
In file included from c:/Users/ME/workspace3/SDLActivity//jni/src/main/an droid/SDL_android_main.c:4:0:
c:/Users/ME/workspace3/SDLActivity//jni/src/main/android/../../SDL_intern al.h:34:24: fatal error: SDL_config.h: No such file or directory
compilation terminated.
make.exe: *** [c:/Users/ME/workspace3/SDLActivity//obj/local/armeabi/objs /main/main/android/SDL_android_main.o] Error 1

Which seems to explicitly differentiate it's main target from the other much longer Android.mk, from the root of the SDL directory. The longer one appears to target the other library I need SDL2, and fails to build that to, although for the very same reason

[armeabi] Compile thumb : SDL2 <= SDL.c
[armeabi] Compile thumb : SDL2 <= SDL_android_main.c
c:/Users/ME/workspace3/SDLActivity//jni/src/SDL_android_main.c:4:32: fata l error: ../../SDL_internal.h: No such file or directory
compilation terminated.
make.exe: *** [c:/Users/ME/workspace3/SDLActivity//obj/local/armeabi/objs /SDL2/src/SDL_android_main.o] Error 1

I've been through these includes and corrected a couple but I don't want to get into too deeply modifying the supposedly good library code.

Out of habit and to get things working better, I edited Android.mk in the subfolder jni/src to

LOCAL_SRC_FILES :=  main.c \
                    main/android/SDL_android_main.c

from the template

LOCAL_SRC_FILES := main.c \
                    $(SDL_PATH)/src/main/android/SDL_android_main.c

The whole jni/src/Android.mk is now:

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)

I think my paths are messed up but there are too many different ways to import this code into Eclipse and I've only found too ways that work even this much.

解决方案

A dirty hack would be changing

SDL_PATH := ../SDL

to

SDL_PATH := ../jni

since that is where we are told to paste it by, "Then copy (or symlink) the whole SDL directory and put it into your project’s jni directory"

This gets ndk-build chugging along for a while until failing to find EGL! which it never can, time for another question, or abandonment:

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

The rest of the solution came from http://blog.csdn.net/jwzhangjie/article/details/9083827 ie creating Application.mk in jni directory to specify

APP_PLATFORM := android-9

This works but taking the advice of Ashoke would be optimal (re creating jni/SDL subfolder), if I'd just skipped to page 3 for DinoMage's tutorial where he states "Put the SDL_ttf source directory alongside your SDL directory in your project (in jni/ so you get jni/SDL_ttf" I'd know that.

[armeabi] Compile thumb : SDL2 <= SDL_test_md5.c
[armeabi] Compile thumb : SDL2 <= SDL_test_random.c
[armeabi] SharedLibrary : libSDL2.so
[armeabi] Install : libSDL2.so => libs/armeabi/libSDL2.so
[armeabi] Compile thumb : main <= SDL_android_main.c
[armeabi] Compile thumb : main <= main.c
[armeabi] SharedLibrary : libmain.so
[armeabi] Install : libmain.so => libs/armeabi/libmain.so

The demo from DinoMage now works.

这篇关于我跟着SDL正式的导游在Android上,但它不是做libmain.so的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆