# HG changeset patch # User Medo <smaxein@googlemail.com> # Date 1345289945 -7200 # Node ID 983ff426f91e0484a6ce499b2e1cecd94539ceba # Parent 4617e8ec0507ffcf3215fb2b94adba36c3faba93 Hedgeroid: Fixed JNA mapping of size_t diff -r 4617e8ec0507 -r 983ff426f91e project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/GameConnection.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/GameConnection.java Sat Aug 18 13:21:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/GameConnection.java Sat Aug 18 13:39:05 2012 +0200 @@ -10,6 +10,7 @@ import org.hedgewars.hedgeroid.frontlib.Frontlib.StrBoolCallback; import org.hedgewars.hedgeroid.frontlib.Frontlib.StrCallback; import org.hedgewars.hedgeroid.frontlib.Frontlib.VoidCallback; +import org.hedgewars.hedgeroid.frontlib.NativeSizeT; import org.hedgewars.hedgeroid.netplay.GameMessageListener; import org.hedgewars.hedgeroid.netplay.Netplay; import org.hedgewars.hedgeroid.util.TickHandler; @@ -20,7 +21,6 @@ import android.util.Log; import com.sun.jna.Memory; -import com.sun.jna.NativeLong; import com.sun.jna.Pointer; public final class GameConnection { @@ -162,7 +162,7 @@ // runs on the IPCThread private final BytesCallback engineMessageCb = new BytesCallback() { - public void callback(Pointer context, Pointer buffer, NativeLong size) { + public void callback(Pointer context, Pointer buffer, NativeSizeT size) { netplay.sendEngineMessage(buffer.getByteArray(0, size.intValue())); } }; @@ -197,10 +197,9 @@ public void run() { Memory mem = new Memory(em.length); mem.write(0, em, 0, em.length); - Flib.INSTANCE.flib_gameconn_send_enginemsg(conn, mem, new NativeLong(em.length)); + Flib.INSTANCE.flib_gameconn_send_enginemsg(conn, mem, NativeSizeT.valueOf(em.length)); } }); - } public void onChatMessage(final String nick, final String message) { diff -r 4617e8ec0507 -r 983ff426f91e project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SettingsFragment.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SettingsFragment.java Sat Aug 18 13:21:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SettingsFragment.java Sat Aug 18 13:39:05 2012 +0200 @@ -30,6 +30,8 @@ import android.widget.Toast; public class SettingsFragment extends Fragment implements RoomStateManager.Observer { + private static final String TAG = SettingsFragment.class.getSimpleName(); + private Spinner styleSpinner, schemeSpinner, weaponsetSpinner, themeSpinner; private ImageView themeIcon; diff -r 4617e8ec0507 -r 983ff426f91e project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/AndroidTypeMapper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/AndroidTypeMapper.java Sat Aug 18 13:39:05 2012 +0200 @@ -0,0 +1,44 @@ +package org.hedgewars.hedgeroid.frontlib; + +import com.sun.jna.DefaultTypeMapper; +import com.sun.jna.FromNativeContext; +import com.sun.jna.ToNativeContext; +import com.sun.jna.TypeConverter; +import com.sun.jna.TypeMapper; + +class AndroidTypeMapper extends DefaultTypeMapper { + static final int NATIVE_INT_SIZE = 4; + static final int NATIVE_SIZE_T_SIZE = 4; + static final int NATIVE_BOOL_SIZE = 1; + public static final TypeMapper INSTANCE = new AndroidTypeMapper(); + + protected AndroidTypeMapper() { + addTypeConverter(Boolean.class, new BooleanConverter()); + addTypeConverter(NativeSizeT.class, new SizeTConverter()); + } + + private static final class BooleanConverter implements TypeConverter { + public Class<Byte> nativeType() { + return Byte.class; + } + public Object fromNative(Object value, FromNativeContext context) { + return ((Byte)value).intValue() != 0 ? Boolean.TRUE : Boolean.FALSE; + } + public Object toNative(Object value, ToNativeContext context) { + return Byte.valueOf((byte)(Boolean.TRUE.equals(value) ? 1 : 0)); + } + } + + private static final class SizeTConverter implements TypeConverter { + public Class<Integer> nativeType() { + return Integer.class; + } + public Object fromNative(Object value, FromNativeContext context) { + return NativeSizeT.valueOf((Integer)value); + } + public Object toNative(Object value, ToNativeContext context) { + return Integer.valueOf(value==null ? 0 : ((NativeSizeT)value).intValue()); + } + } +} + diff -r 4617e8ec0507 -r 983ff426f91e project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/Flib.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/Flib.java Sat Aug 18 13:21:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/Flib.java Sat Aug 18 13:39:05 2012 +0200 @@ -12,7 +12,7 @@ System.loadLibrary("SDL_net"); System.setProperty("jna.encoding", "UTF8"); // Ugly global setting, but it seems JNA doesn't allow setting this per-library... } - public static final Frontlib INSTANCE = (Frontlib)Native.loadLibrary("frontlib", Frontlib.class, Collections.singletonMap(Library.OPTION_TYPE_MAPPER, FrontlibTypeMapper.INSTANCE)); + public static final Frontlib INSTANCE = (Frontlib)Native.loadLibrary("frontlib", Frontlib.class, Collections.singletonMap(Library.OPTION_TYPE_MAPPER, AndroidTypeMapper.INSTANCE)); // Hook frontlib logging into Android logging private static final Frontlib.LogCallback logCb = new Frontlib.LogCallback() { diff -r 4617e8ec0507 -r 983ff426f91e project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/Frontlib.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/Frontlib.java Sat Aug 18 13:21:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/Frontlib.java Sat Aug 18 13:39:05 2012 +0200 @@ -22,7 +22,6 @@ import com.sun.jna.Callback; import com.sun.jna.Library; import com.sun.jna.Memory; -import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.PointerType; import com.sun.jna.Structure; @@ -122,14 +121,10 @@ * headers, the compiler will give you errors if the signatures don't match. */ public interface Frontlib extends Library { - static final int NATIVE_INT_SIZE = 4; - static final int NATIVE_BOOL_SIZE = 1; - public static class NetconnPtr extends PointerType { } public static class MapconnPtr extends PointerType { } public static class GameconnPtr extends PointerType { } - // TODO avoid code duplication in the pointer types public static class MetaschemePtr extends PointerType { public MetaScheme deref() { return deref(getPointer()); @@ -555,10 +550,10 @@ if(buf != null) { drawData = new Memory(buf.length); drawData.write(0, buf, 0, buf.length); - drawDataSize = new NativeLong(buf.length); + drawDataSize = NativeSizeT.valueOf(buf.length); } else { drawData = null; - drawDataSize = new NativeLong(0); + drawDataSize = NativeSizeT.valueOf(0); } templateFilter = map.templateFilter; mazeSize = map.mazeSize; @@ -578,7 +573,7 @@ public String seed; public String theme; public Pointer drawData; - public NativeLong drawDataSize; + public NativeSizeT drawDataSize; public int templateFilter; public int mazeSize; } @@ -687,15 +682,15 @@ public void fillFrom(Scheme scheme) { MetaScheme meta = MetaScheme.INSTANCE; name = scheme.name; - settings = new Memory(NATIVE_INT_SIZE * meta.settings.size()); + settings = new Memory(AndroidTypeMapper.NATIVE_INT_SIZE * meta.settings.size()); for(int i=0; i<meta.settings.size(); i++) { Integer value = scheme.settings.get(meta.settings.get(i).name); - settings.setInt(NATIVE_INT_SIZE*i, value); + settings.setInt(AndroidTypeMapper.NATIVE_INT_SIZE*i, value); } - mods = new Memory(NATIVE_BOOL_SIZE * meta.mods.size()); + mods = new Memory(AndroidTypeMapper.NATIVE_BOOL_SIZE * meta.mods.size()); for(int i=0; i<meta.mods.size(); i++) { Boolean value = scheme.mods.get(meta.mods.get(i).name); - mods.setByte(NATIVE_BOOL_SIZE*i, (byte)(value ? 1 : 0)); + mods.setByte(AndroidTypeMapper.NATIVE_BOOL_SIZE*i, (byte)(value ? 1 : 0)); } } @@ -703,7 +698,7 @@ Map<String, Integer> settingsMap = new HashMap<String, Integer>(); MetaScheme meta = MetaScheme.INSTANCE; for(int i=0; i<meta.settings.size(); i++) { - settingsMap.put(meta.settings.get(i).name, settings.getInt(NATIVE_INT_SIZE*i)); + settingsMap.put(meta.settings.get(i).name, settings.getInt(AndroidTypeMapper.NATIVE_INT_SIZE*i)); } Map<String, Boolean> modsMap = new HashMap<String, Boolean>(); for(int i=0; i<meta.mods.size(); i++) { @@ -934,11 +929,11 @@ } public static interface BytesCallback extends Callback { - void callback(Pointer context, Pointer buffer, NativeLong size); + void callback(Pointer context, Pointer buffer, NativeSizeT size); } public static interface BytesBoolCallback extends Callback { - void callback(Pointer context, Pointer buffer, NativeLong size, boolean arg3); + void callback(Pointer context, Pointer buffer, NativeSizeT size, boolean arg3); } public static interface SchemeCallback extends Callback { @@ -1021,7 +1016,7 @@ int flib_netconn_send_toggleReady(NetconnPtr conn); int flib_netconn_send_addTeam(NetconnPtr conn, TeamPtr team); int flib_netconn_send_removeTeam(NetconnPtr conn, String teamname); - int flib_netconn_send_engineMessage(NetconnPtr conn, Pointer message, NativeLong size); + int flib_netconn_send_engineMessage(NetconnPtr conn, Pointer message, NativeSizeT size); int flib_netconn_send_teamHogCount(NetconnPtr conn, String teamname, int hogcount); int flib_netconn_send_teamColor(NetconnPtr conn, String teamname, int colorIndex); int flib_netconn_send_weaponset(NetconnPtr conn, WeaponsetPtr weaponset); @@ -1032,7 +1027,7 @@ int flib_netconn_send_mapMazeSize(NetconnPtr conn, int mazeSize); int flib_netconn_send_mapSeed(NetconnPtr conn, String seed); int flib_netconn_send_mapTheme(NetconnPtr conn, String theme); - int flib_netconn_send_mapDrawdata(NetconnPtr conn, Pointer drawData, NativeLong size); + int flib_netconn_send_mapDrawdata(NetconnPtr conn, Pointer drawData, NativeSizeT size); int flib_netconn_send_script(NetconnPtr conn, String scriptName); int flib_netconn_send_scheme(NetconnPtr conn, SchemePtr scheme); int flib_netconn_send_roundfinished(NetconnPtr conn, boolean withoutError); @@ -1086,15 +1081,15 @@ static final int GAME_END_ERROR = 3; GameconnPtr flib_gameconn_create(String playerName, GameSetupPtr setup, boolean netgame); - GameconnPtr flib_gameconn_create_playdemo(Buffer demo, NativeLong size); - GameconnPtr flib_gameconn_create_loadgame(String playerName, Buffer save, NativeLong size); + GameconnPtr flib_gameconn_create_playdemo(Buffer demo, NativeSizeT size); + GameconnPtr flib_gameconn_create_loadgame(String playerName, Buffer save, NativeSizeT size); GameconnPtr flib_gameconn_create_campaign(String playerName, String seed, String script); void flib_gameconn_destroy(GameconnPtr conn); int flib_gameconn_getport(GameconnPtr conn); void flib_gameconn_tick(GameconnPtr conn); - int flib_gameconn_send_enginemsg(GameconnPtr conn, Pointer data, NativeLong len); + int flib_gameconn_send_enginemsg(GameconnPtr conn, Pointer data, NativeSizeT len); int flib_gameconn_send_textmsg(GameconnPtr conn, int msgtype, String msg); int flib_gameconn_send_chatmsg(GameconnPtr conn, String playername, String msg); int flib_gameconn_send_quit(GameconnPtr conn); diff -r 4617e8ec0507 -r 983ff426f91e project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/FrontlibTypeMapper.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/FrontlibTypeMapper.java Sat Aug 18 13:21:37 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -package org.hedgewars.hedgeroid.frontlib; - -import com.sun.jna.DefaultTypeMapper; -import com.sun.jna.FromNativeContext; -import com.sun.jna.ToNativeContext; -import com.sun.jna.TypeConverter; -import com.sun.jna.TypeMapper; - -class FrontlibTypeMapper extends DefaultTypeMapper { - public static final TypeMapper INSTANCE = new FrontlibTypeMapper(); - - protected FrontlibTypeMapper() { - addTypeConverter(Boolean.class, new BooleanConverter()); - } -} - -class BooleanConverter implements TypeConverter { - public Class<Byte> nativeType() { - return Byte.class; - } - public Object fromNative(Object value, FromNativeContext context) { - return ((Byte)value).intValue() != 0 ? Boolean.TRUE : Boolean.FALSE; - } - public Object toNative(Object value, ToNativeContext context) { - return Byte.valueOf((byte)(Boolean.TRUE.equals(value) ? 1 : 0)); - } -} diff -r 4617e8ec0507 -r 983ff426f91e project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/NativeSizeT.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/NativeSizeT.java Sat Aug 18 13:39:05 2012 +0200 @@ -0,0 +1,39 @@ +package org.hedgewars.hedgeroid.frontlib; + +/** + * This class represents the native C type size_t. On Android, this type could be mapped with int, + * but we use a separate type to make it easier to adapt for other platforms if anyone wants to use + * the mappings elsewhere. + */ +public final class NativeSizeT extends Number { + private static final long serialVersionUID = 1L; + private final long value; + + private NativeSizeT(long value) { + this.value = value; + } + + public static NativeSizeT valueOf(long l) { + return new NativeSizeT(l); + } + + @Override + public int intValue() { + return (int)value; + } + + @Override + public long longValue() { + return value; + } + + @Override + public double doubleValue() { + return value; + } + + @Override + public float floatValue() { + return value; + } +} diff -r 4617e8ec0507 -r 983ff426f91e project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/ThreadedNetConnection.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/ThreadedNetConnection.java Sat Aug 18 13:21:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/ThreadedNetConnection.java Sat Aug 18 13:39:05 2012 +0200 @@ -38,6 +38,7 @@ import org.hedgewars.hedgeroid.frontlib.Frontlib.VoidCallback; import org.hedgewars.hedgeroid.frontlib.Frontlib.WeaponsetCallback; import org.hedgewars.hedgeroid.frontlib.Frontlib.WeaponsetPtr; +import org.hedgewars.hedgeroid.frontlib.NativeSizeT; import org.hedgewars.hedgeroid.netplay.Netplay.FromNetHandler; import org.hedgewars.hedgeroid.netplay.Netplay.FromNetMsgType; import org.hedgewars.hedgeroid.util.FileUtils; @@ -54,7 +55,6 @@ import android.util.Pair; import com.sun.jna.Memory; -import com.sun.jna.NativeLong; import com.sun.jna.Pointer; /** @@ -312,7 +312,7 @@ }; private final BytesCallback engineMessageCb = new BytesCallback() { - public void callback(Pointer context, Pointer buffer, NativeLong size) { + public void callback(Pointer context, Pointer buffer, NativeSizeT size) { sendFromNet(MSG_ENGINE_MESSAGE, buffer.getByteArray(0, size.intValue())); } }; @@ -498,7 +498,7 @@ byte[] message = (byte[])msg.obj; Memory mem = new Memory(message.length); mem.write(0, message, 0, message.length); - FLIB.flib_netconn_send_engineMessage(conn, mem, new NativeLong(message.length)); + FLIB.flib_netconn_send_engineMessage(conn, mem, NativeSizeT.valueOf(message.length)); break; } case MSG_SEND_ROUND_FINISHED: { @@ -545,7 +545,7 @@ byte[] message = (byte[])msg.obj; Memory mem = new Memory(message.length); mem.write(0, message, 0, message.length); - FLIB.flib_netconn_send_mapDrawdata(conn, mem, new NativeLong(message.length)); + FLIB.flib_netconn_send_mapDrawdata(conn, mem, NativeSizeT.valueOf(message.length)); break; } case MSG_SEND_GAMESTYLE: {