John
John

Reputation: 6648

SDL keeps failing to find font on Android

When I attempt to deploy my app using Eclipse it throws FileNotFoundException on my font, which I've now copied to both the assets/src and assets directory to be doubly sure.

I had this problem before, after succesfully integrating SDL_ttf into my Visual C++ build of the same app and transferring across to Eclipse for Android. Now I'm facing it again I thought I better write about it. The SDL_ttf source comes with a freetype folder already in place and referenced by android as external/freetype-2.4.12. DinoMage states I need to download this separately although he refers to freetype-2.4.11 being the latest. That's the only obvious difference from my VC build, apart from minor compiler intolerances.

I've got it working a bit now. I can sign the app (unsigned didn't work), disable USB debugging, and it will load the font and display a menu. From there it breaks, again, so I can't see how I'm supposed to debug it further. I'm sure I'll fix it somehow. But I'll also forget the obscura if I don't post here.

Upvotes: 0

Views: 423

Answers (2)

Jonny D
Jonny D

Reputation: 2344

I don't know much about using the debugger with Android, but I can make suggestions otherwise.

Is your assets path really named "assetts"? If possible, I'm not sure how one would get Android and SDL to look there instead of "assets".

SDL and it's friend libs like SDL_ttf search for files local to the assets directory first and then search relative to the root directory. So I would expect that your "res/stubbornFont.ttf" will never load because it is in the resources "res" directory and SDL_ttf will not look there.

Maybe you can specify it relative to assets/, like "../res/stubbornFont.ttf", but I haven't tested that. It would work if you put the font in assets/ and loaded it as "stubbornFont.ttf".

Upvotes: 1

John
John

Reputation: 6648

I've think I've got closure on this.

It is possible to debug the app. By continuing it will trap several times trying to load one font. I think it stops eventually, I'm not sure. I've stepped through it from where it lands me at the throw stage. However single stepping from there begins from the synchronized statement, sorry it's Java but from my quick reference to What does 'synchronized' mean? I think this is a race condition

public final AssetFileDescriptor openFd(String fileName)
        throws IOException {
    synchronized (this) {
        if (!mOpen) {
            throw new RuntimeException("Assetmanager has been closed");
        }
        ParcelFileDescriptor pfd = openAssetFd(fileName, mOffsets);
        if (pfd != null) {
            return new AssetFileDescriptor(pfd, mOffsets[0], mOffsets[1]);
        }
    }
    throw new FileNotFoundException("Asset file: " + fileName);//DEBUGGER traps here
}

You might be there all day single stepping that! It appears to perform all steps required of it and finally I land in:

public static ReadableByteChannel newChannel(InputStream inputStream) {
    return new InputStreamChannel(inputStream);
}

assetmanager members of <code>inputStream</code>

No, not finally, lastly, there is

public static Context getContext() {
    return mSingleton;
}

In the SDLActivity I extend.

That has a bunch of members I don't want to know about:

sdlactivity singleton members

Luckily I discovered I can selectively "Disconnect" using a button in eclipse two along from debug/run. It has no keyboard shortcut and I'm not sure why but it will reconnect when I next trigger an exception. This is debugging as I know and love it in Android and Eclipse, still probably easier than GDB.

For arguments sake I've even replaced:

//TTF_Font *gFont = TTF_OpenFont( "res/stubbornFont.ttf", 160 );

with

TTF_Font *font=TTF_OpenFontRW(SDL_RWFromFile("res/stubbornFont.ttf", "rb"), 1, 160);//Same difference

UPDATE/EDIT

Here is the solution I was really looking for, turning off uncaught exceptions in eclipse, it really is just that, Window->Preferences->Java->Debug and it's the very first box at the top for me.

Upvotes: 0

Related Questions