[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/bindings/krossjava
From:       Vincent Verhoeven <verhoevenv () gmail ! com>
Date:       2007-07-11 0:13:23
Message-ID: 1184112803.225674.16366.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 686293 by verhoevenv:

Boolean and UInt seem to be working. Double and QByteArray need some 
more work. Test.java has been restructured slightly to keep some 
structure.


 M             Test.class  
 M  +46 -1     Test.java  
 M             TestObject.class  
 M  +11 -11    TestObject.java  
 M  +5 -0      krossjava/java/KrossQExtension.java  
 M  +3 -7      krossjava/jvmvariant.cpp  
 M  +24 -10    krossjava/jvmvariant.h  
 M             krossjava/kross.jar  


--- trunk/playground/bindings/krossjava/Test.java #686292:686293
@@ -2,13 +2,58 @@
 
 public class Test {
 
+    private TestObject to;
+
     public Test() {
         System.out.println("Hello World !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-        TestObject to = (TestObject)(KrossClassLoader.importModule("TestObject"));
+        setUp();
+        testName();
+        testInt();
+        testUInt();
+        testString();
+        testBool();
+        testDouble();  //TODO: this doesn't pass yet
+        testByteArray();  //TODO: this neither
+    }
+
+    public void setUp() {
+        to = (TestObject)(KrossClassLoader.importModule("TestObject"));
+    }
+
+    public void testName() {
         String name = to.name();
         System.out.println("TestObject name=" + name);
+    }
+
+    public void testInt() {
         System.out.println("TestObject.func_int_int(5)=" + to.func_int_int(5));
+    }
+
+    public void testUInt() {
+        System.out.println("TestObject.func_uint_uint(5)=" + to.func_uint_uint(5));
+    }
+
+    public void testString() {
         System.out.println("TestObject.func_qstring_qstring(\"Kross Power!\")=" + \
to.func_qstring_qstring("Kross Power!"));  }
 
+    public void testBool() {
+        System.out.println("TestObject.func_bool_bool(true)=" + \
to.func_bool_bool(true)); +    }
+
+    public void testDouble() {
+        //TODO: this returns 3.0 instead of 3.14
+        System.out.println("TestObject.func_double_double(3.14)=" + \
to.func_double_double(3.14)); +    }
+
+    public void testByteArray() {
+        //The problem here is that encapsulating every single byte in a Byte is very \
wasteful. +        //And we also need this convertion on the C side, when reading in \
class files. +        //However, byte[] is also a jobject, so perhaps it'll work like \
this. +
+        //Byte[] in = {new Byte((byte)65), new Byte((byte)0), new Byte((byte)66)};
+        byte[] in = {65, 0, 66};
+        byte[] out = to.func_qbytearray_qbytearray(in);
+        System.out.println("TestObject.func_qbytearray_qbytearray=(" + out[0] + "," \
+ out[1] + "," + out[2] + ")"); +    }
 }
--- trunk/playground/bindings/krossjava/TestObject.java #686292:686293
@@ -1,4 +1,6 @@
 import org.kde.kdebindings.java.krossjava.*;
+import java.lang.*;
+import java.util.*;
 
 public class TestObject extends KrossQExtension {
 
@@ -22,20 +24,18 @@
     // are not able to handle more then 9 anyway + we would work around the rather \
expensive  // list packing/unpacking.
 
-    //public boolean func_bool_bool(boolean b){ return \
(boolean)invoke("func_bool_bool", b); } +    public Boolean func_bool_bool(Boolean \
b){ return (Boolean)invoke("func_bool_bool", b); }  public Integer \
                func_int_int(Integer i){
-        Object[] oa = {i};
-        return (Integer)invoke("func_int_int", oa);
+        return (Integer)invoke("func_int_int", i);
     }
-    //public int func_uint_uint(int i){ return (int)invoke("func_uint_uint", i); }
-    //public double func_double_double(double d){ return \
                (double)invoke("func_double_double", d); }
-    //public Byte[] func_qbytearray_qbytearray(Byte[] b){ return \
(Byte[])invoke("func_qbytearray_qbytearray", b); } +    public Integer \
func_uint_uint(Integer i){ return (Integer)invoke("func_uint_uint", i); } +    public \
Double func_double_double(Double d){ return (Double)invoke("func_double_double", d); \
} +    public byte[] func_qbytearray_qbytearray(byte[] b){ return \
(byte[])invoke("func_qbytearray_qbytearray", b); }  public String \
                func_qstring_qstring(String s) {
-        Object[] oa = {s};
-        return (String)invoke("func_qstring_qstring", oa);
+        return (String)invoke("func_qstring_qstring", s);
     }
-    //public String[] func_qstringlist_qstringlist(String[] s){ return \
                (String[])invoke("func_qstringlist_qstringlist", s); }
-    //public ArrayList func_qvariantlist_qvariantlist(ArrayList l){ return \
                (ArrayList)invoke("func_qvariantlist_qvariantlist", l); }
-    //public Map func_qvariantmap_qvariantmap(Map m){ return \
(Map)invoke("func_qvariantmap_qvariantmap", m); } +    public String[] \
func_qstringlist_qstringlist(String[] s){ return \
(String[])invoke("func_qstringlist_qstringlist", s); } +    public ArrayList \
func_qvariantlist_qvariantlist(ArrayList l){ return \
(ArrayList)invoke("func_qvariantlist_qvariantlist", l); } +    public Map \
func_qvariantmap_qvariantmap(Map m){ return \
(Map)invoke("func_qvariantmap_qvariantmap", m); }  
 }
--- trunk/playground/bindings/krossjava/krossjava/java/KrossQExtension.java \
#686292:686293 @@ -20,5 +20,10 @@
 		return invokeNative(getPointer(), name, null);
 	}
 
+	public Object invoke(String name, Object arg){
+		Object[] oa = {arg};
+		return invokeNative(getPointer(), name, oa);
+	}
+
 	private native Object invokeNative(long qobjpointer, String name, Object[] args);
 }
\ No newline at end of file
--- trunk/playground/bindings/krossjava/krossjava/jvmvariant.cpp #686292:686293
@@ -30,19 +30,17 @@
     switch( v.type() ) {
         case QVariant::Int:
             return JavaType<int>::toJObject(v.toInt(), env);
-#if 0
         case QVariant::UInt:
             return JavaType<uint>::toJObject(v.toUInt(), env);
         case QVariant::Double:
             return JavaType<double>::toJObject(v.toDouble(), env);
         case QVariant::ByteArray:
             return JavaType<QByteArray>::toJObject(v.toByteArray(), env);
-#endif
         case QVariant::String:
             return JavaType<QString>::toJObject(v.toString(), env);
-#if 0
         case QVariant::Bool:
             return JavaType<bool>::toJObject(v.toBool(), env);
+#if 0
         case QVariant::StringList:
             return JavaType<QStringList>::toJObject(v.toStringList(), env);
         case QVariant::Map:
@@ -135,7 +133,6 @@
     switch(typeId) {
         case QVariant::Int:
             return new JVMMetaTypeVariant<int>(value, env);
-#if 0
         case QVariant::UInt:
             return new JVMMetaTypeVariant<uint>(value, env);
         case QVariant::Double:
@@ -144,7 +141,6 @@
             return new JVMMetaTypeVariant<bool>(value, env);
         case QVariant::ByteArray:
             return new JVMMetaTypeVariant<QByteArray>(value, env);
-#endif
         case QVariant::String:
             return new JVMMetaTypeVariant<QString>(value, env);
 #if 0
@@ -179,7 +175,7 @@
 #if 0
             if( JVMExtension::isJVMExtension(value) ) {
                 #ifdef KROSS_JVM_VARIANT_DEBUG
-                    krossdebug( QString("JVMMetaTypeFactory::create VALUE with \
typeId '%1' is a JVMExtension object").arg(typeId) ); +                    \
krossdebug( QString("JVMMetaTypeFactory::create jobject with typeId '%1' is a \
JVMExtension object").arg(typeId) );  #endif
                 JVMExtension* extension;
                 Data_Get_Struct(value, JVMExtension, extension);
@@ -203,7 +199,7 @@
             //if(typeId == QVariant::Invalid) return new RubyVariantImpl<void>();
             //return new RubyVariantImpl<QVariant>(v);
 #endif
-            krosswarning( QString("JVMMetaTypeFactory::create Not possible to \
convert the VALUE to QVariant with '%1' and metaid \
'%2'").arg(QVariant::typeToName((QVariant::Type)typeId)).arg(typeId) ); +            \
krosswarning( QString("JVMMetaTypeFactory::create Not possible to convert the jobject \
to QVariant with '%1' and metaid \
'%2'").arg(QVariant::typeToName((QVariant::Type)typeId)).arg(typeId) );  return 0;
         } break;
     }
--- trunk/playground/bindings/krossjava/krossjava/jvmvariant.h #686292:686293
@@ -81,6 +81,7 @@
             return js;
         }
         inline static QString toVariant(jobject value, JNIEnv* env) {
+            //TODO: the static_casting is unfortunate... Is there another way?
             jstring jstr = static_cast<jstring>(value);
             const char *str = env->GetStringUTFChars(jstr, 0);
             QString s = str;
@@ -99,7 +100,8 @@
                 env->SetObjectArrayElement(objarray, i, \
JavaType<QString>::toJObject(list[i], env));  return objarray;
         }
-        inline static QStringList toVariant(jobjectArray objarray, JNIEnv* env) {
+        inline static QStringList toVariant(jobject value, JNIEnv* env) {
+            jobjectArray objarray = static_cast<jobjectArray>(value);
             const jsize len = env->GetArrayLength(objarray);
             const int count = len;
             QStringList list;
@@ -124,7 +126,8 @@
             env->SetByteArrayRegion(bytearray, 0, count, bytes);
             return bytearray;
         }
-        inline static QByteArray toVariant(jbyteArray bytearray, JNIEnv* env) {
+        inline static QByteArray toVariant(jobject value, JNIEnv* env) {
+            jbyteArray bytearray = static_cast<jbyteArray>(value);
             jsize len = env->GetArrayLength(bytearray);
             int count = len;
             char bytes[count];
@@ -148,15 +151,18 @@
         }
     };
 
-#if 0
     template<>
     struct JavaType<uint>
     {
         inline static jobject toJObject(int i, JNIEnv* env) {
-            return quint32(i); //jint is signed 32 bits
+            jclass cl = env->FindClass("java/lang/Integer");
+            jmethodID ctor = env->GetMethodID(cl, "<init>", "(I)V");
+            return env->NewObject(cl, ctor, quint32(i));
         }
         inline static uint toVariant(jobject value, JNIEnv* env) {
-            return quint32(value);
+            jclass cl = env->FindClass("java/lang/Integer");
+            jmethodID getval = env->GetMethodID(cl, "intValue", "()I");
+            return qint32(env->CallIntMethod(value, getval));
         }
     };
 
@@ -164,10 +170,14 @@
     struct JavaType<double>
     {
         inline static jobject toJObject(double d, JNIEnv* env) {
-            return d; //64 bits
+            jclass cl = env->FindClass("java/lang/Double");
+            jmethodID ctor = env->GetMethodID(cl, "<init>", "(D)V");
+            return env->NewObject(cl, ctor, d);
         }
         inline static double toVariant(jobject value, JNIEnv* env) {
-            return value;
+            jclass cl = env->FindClass("java/lang/Double");
+            jmethodID getval = env->GetMethodID(cl, "doubleValue", "()D");
+            return qint32(env->CallDoubleMethod(value, getval));
         }
     };
 
@@ -175,13 +185,17 @@
     struct JavaType<bool>
     {
         inline static jobject toJObject(bool b, JNIEnv* env) {
-            return b ? JNI_TRUE : JNI_FALSE;
+            jclass cl = env->FindClass("java/lang/Boolean");
+            jmethodID ctor = env->GetMethodID(cl, "<init>", "(Z)V");
+            return env->NewObject(cl, ctor, b);
         }
         inline static bool toVariant(jobject value, JNIEnv* env) {
-            return value == JNI_TRUE;
+            jclass cl = env->FindClass("java/lang/Boolean");
+            jmethodID getval = env->GetMethodID(cl, "booleanValue", "()Z");
+            return env->CallBooleanMethod(value, getval);
         }
     };
-
+#if 0
     template<>
     struct JavaType<qlonglong>
     {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic