bind,internal/importers: handle Java long constants correctly

Change-Id: Idff789038e7470ef5b12798273fc67165d57f4dc
Reviewed-on: https://go-review.googlesource.com/35293
Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
Elias Naur
2017-01-17 15:58:41 +00:00
parent d05d36a362
commit c4d780faeb
6 changed files with 172 additions and 2 deletions
+48 -1
View File
@@ -6,6 +6,8 @@
static jclass class_java_lang_Float;
static jmethodID m_java_lang_Float_toString;
static jclass class_java_lang_Long;
static jmethodID m_java_lang_Long_toString;
static jclass class_java_lang_Object;
static jmethodID m_java_lang_Object_toString;
static jclass class_java_lang_Runnable;
@@ -15,11 +17,14 @@ static jclass class_java_lang_Character_Subset;
static jmethodID m_java_lang_Character_Subset_toString;
void init_proxies() {
JNIEnv *env = go_seq_push_local_frame(5);
JNIEnv *env = go_seq_push_local_frame(6);
jclass clazz;
clazz = (*env)->FindClass(env, "java/lang/Float");
class_java_lang_Float = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Float_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
clazz = (*env)->FindClass(env, "java/lang/Long");
class_java_lang_Long = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Long_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
clazz = (*env)->FindClass(env, "java/lang/Object");
class_java_lang_Object = (*env)->NewGlobalRef(env, clazz);
m_java_lang_Object_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
@@ -50,6 +55,22 @@ ret_nstring cproxy_java_lang_Float_toString(jint this) {
return __res;
}
ret_nstring cproxy_java_lang_Long_toString(jint this) {
JNIEnv *env = go_seq_push_local_frame(1);
// Must be a Java object
jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
jstring res = (*env)->CallObjectMethod(env, _this, m_java_lang_Long_toString);
jobject _exc = go_seq_get_exception(env);
int32_t _exc_ref = go_seq_to_refnum(env, _exc);
if (_exc != NULL) {
res = NULL;
}
nstring _res = go_seq_from_java_string(env, res);
go_seq_pop_local_frame(env);
ret_nstring __res = {_res, _exc_ref};
return __res;
}
ret_nstring cproxy_java_lang_Object_toString(jint this) {
JNIEnv *env = go_seq_push_local_frame(1);
// Must be a Java object
@@ -112,6 +133,9 @@ ret_nstring cproxy_java_lang_Character_Subset_toString(jint this) {
jclass proxy_class_java_F;
jmethodID proxy_class_java_F_cons;
static jmethodID mid_F_ToString;
jclass proxy_class_java_L;
jmethodID proxy_class_java_L_cons;
static jmethodID mid_L_ToString;
jclass proxy_class_java_O;
jmethodID proxy_class_java_O_cons;
static jmethodID mid_O_ToString;
@@ -130,6 +154,12 @@ Java_java_Java__1init(JNIEnv *env, jclass _unused) {
clazz = (*env)->FindClass(env, "java/F");
mid_F_ToString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;");
clazz = (*env)->FindClass(env, "java/Java$proxyL");
proxy_class_java_L = (*env)->NewGlobalRef(env, clazz);
proxy_class_java_L_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
clazz = (*env)->FindClass(env, "java/L");
mid_L_ToString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;");
clazz = (*env)->FindClass(env, "java/Java$proxyO");
proxy_class_java_O = (*env)->NewGlobalRef(env, clazz);
proxy_class_java_O_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
@@ -166,6 +196,23 @@ nstring cproxyjava_F_ToString(int32_t refnum) {
return _res;
}
JNIEXPORT jstring JNICALL
Java_java_Java_00024proxyL_toString(JNIEnv* env, jobject __this__) {
int32_t o = go_seq_to_refnum_go(env, __this__);
nstring r0 = proxyjava_L_ToString(o);
jstring _r0 = go_seq_to_java_string(env, r0);
return _r0;
}
nstring cproxyjava_L_ToString(int32_t refnum) {
JNIEnv *env = go_seq_push_local_frame(0);
jobject o = go_seq_from_refnum(env, refnum, proxy_class_java_L, proxy_class_java_L_cons);
jstring res = (*env)->CallObjectMethod(env, o, mid_L_ToString);
nstring _res = go_seq_from_java_string(env, res);
go_seq_pop_local_frame(env);
return _res;
}
JNIEXPORT jstring JNICALL
Java_java_Java_00024proxyO_toString(JNIEnv* env, jobject __this__) {
int32_t o = go_seq_to_refnum_go(env, __this__);