2
0
mirror of synced 2025-02-24 07:18:15 +00:00
mobile/bind/testdata/structs.java.c.golden
Elias Naur 6fca37c69e mobile/bind: replace seq serialization with direct calls
The seq serialization machinery is a historic artifact from when Go
mobile code had to run in a separate process. Now that Go code is running
in-process, replace the explicit serialization with direct calls and pass
arguments on the stack.

The benefits are a much smaller bind runtime, much less garbage (and, in
Java, fewer objects with finalizers), less argument copying, and faster
cross-language calls.
The cost is a more complex generator, because some of the work from the
bind runtime is moved to generated code. Generated code now handles
conversion between Go and Java/ObjC types, multiple return values and memory
management of byte slice and string arguments.

To overcome the lack of calling C code between Go packages, all bound
packages now end up in the same (fake) package, "gomobile_bind", instead of
separate packages (go_<pkgname>). To avoid name clashes, the package name is
added as a prefix to generated functions and types.

Also, don't copy byte arrays passed to Go, saving call time and
allowing read([]byte)-style interfaces to foreign callers (#12113).

Finally, add support for nil interfaces and struct pointers to objc.

This is a large CL, but most of the changes stem from changing testdata.

The full benchcmp output on the CL/20095 benchmarks on my Nexus 5 is
reproduced below. Note that the savings for the JavaSlice* benchmarks are
skewed because byte slices are no longer copied before passing them to Go.

benchmark                                 old ns/op     new ns/op     delta
BenchmarkJavaEmpty                        26.0          19.0          -26.92%
BenchmarkJavaEmptyDirect                  23.0          22.0          -4.35%
BenchmarkJavaNoargs                       7685          2339          -69.56%
BenchmarkJavaNoargsDirect                 17405         8041          -53.80%
BenchmarkJavaOnearg                       26887         2366          -91.20%
BenchmarkJavaOneargDirect                 34266         7910          -76.92%
BenchmarkJavaOneret                       38325         2245          -94.14%
BenchmarkJavaOneretDirect                 46265         7708          -83.34%
BenchmarkJavaManyargs                     41720         2535          -93.92%
BenchmarkJavaManyargsDirect               51026         8373          -83.59%
BenchmarkJavaRefjava                      38139         21260         -44.26%
BenchmarkJavaRefjavaDirect                42706         28150         -34.08%
BenchmarkJavaRefgo                        34403         6843          -80.11%
BenchmarkJavaRefgoDirect                  40193         16582         -58.74%
BenchmarkJavaStringShort                  32366         9323          -71.20%
BenchmarkJavaStringShortDirect            41973         19118         -54.45%
BenchmarkJavaStringLong                   127879        94420         -26.16%
BenchmarkJavaStringLongDirect             133776        114760        -14.21%
BenchmarkJavaStringShortUnicode           32562         9221          -71.68%
BenchmarkJavaStringShortUnicodeDirect     41464         19094         -53.95%
BenchmarkJavaStringLongUnicode            131015        89401         -31.76%
BenchmarkJavaStringLongUnicodeDirect      134130        90786         -32.31%
BenchmarkJavaSliceShort                   42462         7538          -82.25%
BenchmarkJavaSliceShortDirect             52940         17017         -67.86%
BenchmarkJavaSliceLong                    138391        8466          -93.88%
BenchmarkJavaSliceLongDirect              205804        15666         -92.39%
BenchmarkGoEmpty                          3.00          3.00          +0.00%
BenchmarkGoEmptyDirect                    3.00          3.00          +0.00%
BenchmarkGoNoarg                          40342         13716         -66.00%
BenchmarkGoNoargDirect                    46691         13569         -70.94%
BenchmarkGoOnearg                         43529         13757         -68.40%
BenchmarkGoOneargDirect                   44867         14078         -68.62%
BenchmarkGoOneret                         45456         13559         -70.17%
BenchmarkGoOneretDirect                   44694         13442         -69.92%
BenchmarkGoRefjava                        55111         28071         -49.06%
BenchmarkGoRefjavaDirect                  60883         26872         -55.86%
BenchmarkGoRefgo                          57038         29223         -48.77%
BenchmarkGoRefgoDirect                    56153         27812         -50.47%
BenchmarkGoManyargs                       67967         17398         -74.40%
BenchmarkGoManyargsDirect                 60617         16998         -71.96%
BenchmarkGoStringShort                    57538         22600         -60.72%
BenchmarkGoStringShortDirect              52627         22704         -56.86%
BenchmarkGoStringLong                     128485        52530         -59.12%
BenchmarkGoStringLongDirect               138377        52079         -62.36%
BenchmarkGoStringShortUnicode             57062         22994         -59.70%
BenchmarkGoStringShortUnicodeDirect       62563         22938         -63.34%
BenchmarkGoStringLongUnicode              139913        55553         -60.29%
BenchmarkGoStringLongUnicodeDirect        150863        57791         -61.69%
BenchmarkGoSliceShort                     59279         20215         -65.90%
BenchmarkGoSliceShortDirect               60160         21136         -64.87%
BenchmarkGoSliceLong                      411225        301870        -26.59%
BenchmarkGoSliceLongDirect                399029        298915        -25.09%

Fixes golang/go#12619
Fixes golang/go#12113
Fixes golang/go#13033

Change-Id: I2b45e9e98a1248e3c23a5137f775f7364908bec7
Reviewed-on: https://go-review.googlesource.com/19821
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
2016-03-03 15:03:45 +00:00

123 lines
4.2 KiB
Plaintext

// JNI functions for the Go <=> Java bridge.
// gobind -lang=java structs
//
// File is generated by gobind. Do not edit.
#include <android/log.h>
#include <stdint.h>
#include "seq.h"
#include "structs.h"
#include "_cgo_export.h"
static jclass proxy_class_structs_I;
static jmethodID proxy_class_structs_I_cons;
static jmethodID mid_I_M;
static jclass proxy_class_structs_S;
static jmethodID proxy_class_structs_S_cons;
static jclass proxy_class_structs_S2;
static jmethodID proxy_class_structs_S2_cons;
JNIEXPORT void JNICALL
Java_go_structs_Structs_init(JNIEnv *env, jclass _unused) {
jclass clazz;
clazz = (*env)->FindClass(env, "go/structs/Structs$S");
proxy_class_structs_S = (*env)->NewGlobalRef(env, clazz);
proxy_class_structs_S_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
clazz = (*env)->FindClass(env, "go/structs/Structs$S2");
proxy_class_structs_S2 = (*env)->NewGlobalRef(env, clazz);
proxy_class_structs_S2_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
clazz = (*env)->FindClass(env, "go/structs/Structs$I$Proxy");
proxy_class_structs_I = (*env)->NewGlobalRef(env, clazz);
proxy_class_structs_I_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
clazz = (*env)->FindClass(env, "go/structs/Structs$I");
mid_I_M = (*env)->GetMethodID(env, clazz, "M", "()V");
}
JNIEXPORT jobject JNICALL
Java_go_structs_Structs_Identity(JNIEnv* env, jclass clazz, jobject s) {
int32_t _s = go_seq_to_refnum(env, s);
int32_t r0 = proxystructs__Identity(_s);
jobject _r0 = go_seq_from_refnum(env, r0, proxy_class_structs_S, proxy_class_structs_S_cons);
return _r0;
}
JNIEXPORT jobject JNICALL
Java_go_structs_Structs_IdentityWithError(JNIEnv* env, jclass clazz, jobject s) {
int32_t _s = go_seq_to_refnum(env, s);
struct proxystructs__IdentityWithError_return res = proxystructs__IdentityWithError(_s);
jobject _r0 = go_seq_from_refnum(env, res.r0, proxy_class_structs_S, proxy_class_structs_S_cons);
jstring _r1 = go_seq_to_java_string(env, res.r1);
go_seq_maybe_throw_exception(env, _r1);
return _r0;
}
JNIEXPORT jobject JNICALL
Java_go_structs_Structs_00024S_Identity(JNIEnv* env, jobject this) {
int32_t o = go_seq_to_refnum(env, this);
struct proxystructs_S_Identity_return res = proxystructs_S_Identity(o);
jobject _r0 = go_seq_from_refnum(env, res.r0, proxy_class_structs_S, proxy_class_structs_S_cons);
jstring _r1 = go_seq_to_java_string(env, res.r1);
go_seq_maybe_throw_exception(env, _r1);
return _r0;
}
JNIEXPORT jdouble JNICALL
Java_go_structs_Structs_00024S_Sum(JNIEnv* env, jobject this) {
int32_t o = go_seq_to_refnum(env, this);
double r0 = proxystructs_S_Sum(o);
jdouble _r0 = (jdouble)r0;
return _r0;
}
JNIEXPORT void JNICALL
Java_go_structs_Structs_00024S_setX(JNIEnv *env, jobject this, jdouble v) {
int32_t o = go_seq_to_refnum(env, this);
double _v = (double)v;
proxystructs_S_X_Set(o, _v);
}
JNIEXPORT jdouble JNICALL
Java_go_structs_Structs_00024S_getX(JNIEnv *env, jobject this) {
int32_t o = go_seq_to_refnum(env, this);
double r0 = proxystructs_S_X_Get(o);
jdouble _r0 = (jdouble)r0;
return _r0;
}
JNIEXPORT void JNICALL
Java_go_structs_Structs_00024S_setY(JNIEnv *env, jobject this, jdouble v) {
int32_t o = go_seq_to_refnum(env, this);
double _v = (double)v;
proxystructs_S_Y_Set(o, _v);
}
JNIEXPORT jdouble JNICALL
Java_go_structs_Structs_00024S_getY(JNIEnv *env, jobject this) {
int32_t o = go_seq_to_refnum(env, this);
double r0 = proxystructs_S_Y_Get(o);
jdouble _r0 = (jdouble)r0;
return _r0;
}
JNIEXPORT void JNICALL
Java_go_structs_Structs_00024S2_M(JNIEnv* env, jobject this) {
int32_t o = go_seq_to_refnum(env, this);
proxystructs_S2_M(o);
}
JNIEXPORT void JNICALL
Java_go_structs_Structs_00024I_00024Proxy_M(JNIEnv* env, jobject this) {
int32_t o = go_seq_to_refnum(env, this);
proxystructs_I_M(o);
}
void cproxystructs_I_M(int32_t refnum) {
JNIEnv *env = go_seq_push_local_frame(10);
jobject o = go_seq_from_refnum(env, refnum, proxy_class_structs_I, proxy_class_structs_I_cons);
(*env)->CallVoidMethod(env, o, mid_I_M);
go_seq_pop_local_frame(env);
}