JNIEXPORT void JNICALL Java_org_mahu_proto_jnitest_nativewrapper_HelloJNI_processDataClass1_a (JNIEnv *env, jobject obj, jobject dataClass1Obj) { printf("### Java_org_mahu_proto_jnitest_nativewrapper_HelloJNI_processDataClass1\n"); JavaObject javaObjectDataClass(env,"org/mahu/proto/jnitest/nativewrapper/DataClass1", dataClass1Obj); jboolean boolValue = javaObjectDataClass.getBooleanField("booleanValue"); javaObjectDataClass.setBooleanField("booleanValue",true); jint intValue = javaObjectDataClass.getIntField("intValue"); javaObjectDataClass.setIntField("intValue",intValue*2); JavaStringIn str(env,javaObjectDataClass.getStringField("stringValue")); std::ostringstream os; os << str.getString() << "-jni" << "\0"; javaObjectDataClass.setStringField("stringValue", os.str()); jfloat f = javaObjectDataClass.getFloatField("floatValue"); javaObjectDataClass.setFloatField("floatValue",f * 3); jdouble d = javaObjectDataClass.getDoubleField("doubleValue"); javaObjectDataClass.setDoubleField("doubleValue",d/2); JByteArrayPtrIn byteArray(env, javaObjectDataClass.getBytesField("byteArrayValue")); if (byteArray.getNumberOfBytes()>0) { int nrOfBytes = byteArray.getNumberOfBytes()*2; jbyte buf[nrOfBytes]; javaObjectDataClass.setBytesField("byteArrayValue", buf, nrOfBytes); } }
/* * Class: org_mahu_proto_jnitest_nativewrapper_HelloJNI * Method: processDataClass * Signature: (Lorg/mahu/proto/jnitest/nativewrapper/DataClass;)V */ JNIEXPORT void JNICALL Java_org_mahu_proto_jnitest_nativewrapper_HelloJNI_processDataClass (JNIEnv *env, jobject obj, jobject dataClassObj) { printf("### Java_org_mahu_proto_jnitest_nativewrapper_HelloJNI_processDataClass\n"); JavaObject javaObjectDataClass(env,"org/mahu/proto/jnitest/nativewrapper/DataClass", dataClassObj); jboolean boolValue = javaObjectDataClass.getBoolean("getBooleanValue"); javaObjectDataClass.setBoolean("setBooleanValue",true); jint val = javaObjectDataClass.getInt("getIntValue"); if (boolValue) { printf("Method getIntValue() return: %i\n", val); } javaObjectDataClass.setInt("setIntValue",val*2); JavaStringIn str(env,javaObjectDataClass.getString("getStringValue")); std::ostringstream os; os << str.getString() << "-jni" << "\0"; javaObjectDataClass.setString("setStringValue", os.str()); jfloat f = javaObjectDataClass.getFloat("getFloatValue"); javaObjectDataClass.setFloat("setFloatValue",f * 3); jdouble d = javaObjectDataClass.getDouble("getDoubleValue"); javaObjectDataClass.setDouble("setDoubleValue",d/2); JByteArrayPtrIn byteArray(env, javaObjectDataClass.getBytes("getByteArrayValue")); if (byteArray.getNumberOfBytes()>0) { int nrOfBytes = byteArray.getNumberOfBytes()*2; jbyte buf[nrOfBytes]; javaObjectDataClass.setBytes("setByteArrayValue", buf, nrOfBytes); } }
/* * Class: org_mahu_proto_jnitest_nativewrapper_HelloJNI * Method: testSpecial * Signature: (I)I */ jint Java_org_mahu_proto_jnitest_nativewrapper_HelloJNI_testSpecial_helper (JNIEnv *env, jobject obj, jint test) { std::cout << "### Java_org_mahu_proto_jnitest_nativewrapper_HelloJNI_testSpecial, test " << test << std::endl; switch(test) { case 0: // call method on object that returns a string. { JavaObject javaObjectDataClass(env,"org/mahu/proto/jnitest/nativewrapper/DataClass"); jobject stringObj = javaObjectDataClass.getObject("getStringValue","()Ljava/lang/String;"); JavaObject stringJavaObj(env, "java/lang/String",stringObj); jint length = stringJavaObj.getInt("length"); std::cout << "Length of string is: " << length << std::endl; return 0; } case 1: // call field on object that returns a string. { JavaObject javaObjectDataClass(env,"org/mahu/proto/jnitest/nativewrapper/DataClass1"); jobject stringObj = javaObjectDataClass.getObjectField("stringValue","Ljava/lang/String;"); JavaObject stringJavaObj(env, "java/lang/String",stringObj); jint length = stringJavaObj.getInt("length"); std::cout << "Length of string is: " << length << std::endl; return 0; } case 2: { MyClass myClass(env, *myGlobalClass, obj); int value = myClass.test.get()+10; myClass.test.set(value); return myClass.test.get(); } case 3: // JNI_SPECIAL_CASE_MYCLASS_GET_METHOD_INT { MyClass myClass(env, *myGlobalClass, obj); int value = myClass.intMethod.get()+10; myClass.intMethod.set(value); return myClass.intMethod.get(); } case 4: // JNI_SPECIAL_CASE_GET_SIZEOF_VOID_POINTER { return sizeof(void *); } case 5: // JNI_SPECIAL_CASE_GET_SIZEOF_JLONG { return sizeof(jlong); } case 6: // JNI_SPECIAL_CASE_LOAD_CLASS { JavaObject javaObjectDataClass(env,"org/mahu/proto/jnitest/nativewrapper/DataClass2"); jint intValue = javaObjectDataClass.getIntField("intValue"); return intValue; } case 7: // SEGV { // baz(); return 1; } case 8: // JNI_SPECIAL_CASE_PRINT_OBJECTREF { std::cout << "HelloJNI objRef " << std::hex << std::showbase << obj << std::dec << std::endl; for(int i=0; i<100; i++) { JavaObject javaObjectDataClass(env,"org/mahu/proto/jnitest/nativewrapper/DataClass2"); std::cout << "DataClass2 objRef " << std::hex << std::showbase << javaObjectDataClass.getJObject() << std::dec << std::endl; } break; } case 9: // JNI_SPECIAL_CASE_BIG_ARRAY_READ { JavaObject javaObject(env, "org/mahu/proto/jnitest/nativewrapper/HelloJNI", obj); JByteArrayPtrIn byteArray(env, javaObject.getBytesField("specialBytes")); return 1; } default: break; } return 1; }