# HG changeset patch # User Medo # 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 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 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 settingsMap = new HashMap(); MetaScheme meta = MetaScheme.INSTANCE; for(int i=0; i modsMap = new HashMap(); for(int i=0; i 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: {