Herramienta de generación de código de plantilla de Go para JNI, se utiliza junto con https://github.com/ClarkGuan/jni para facilitar la comunicación entre Java y Go.
- Actualmente, solo admite la resolución de un único archivo fuente de Java.
- No admite importaciones con *.
gojni xxx.java
package edu.buaa;
public class Main {
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
nativeHello();
}
private static native void nativeHello();
}Supongamos que la ruta del archivo fuente es $HOME/src/java/Main.java. Ejecute el comando
gojni -p main -o $HOME/src/go $HOME/src/java/Main.java
Esto generará dos archivos en el directorio $HOME/src/go: libs.c y libs.go.
libs.c:
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#include <jni.h>
#include "_cgo_export.h"
extern void jniOnLoad(GoUintptr vm);
extern void jniOnUnload(GoUintptr vm);
extern void jni_edu_buaa_nativeHello1(GoUintptr env, GoUintptr clazz);
jint JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env = NULL;
if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
fprintf(stderr, "[%s:%d] GetEnv() return error\n", __FILE__, __LINE__);
abort();
}
jclass clazz;
JNINativeMethod methods[255];
jint size;
char *name;
name = "edu/buaa/Main";
clazz = (*env)->FindClass(env, name);
size = 0;
methods[size].fnPtr = jni_edu_buaa_nativeHello1;
methods[size].name = "nativeHello";
methods[size].signature = "()V";
size++;
if ((*env)->RegisterNatives(env, clazz, methods, size) != 0) {
fprintf(stderr, "[%s:%d] %s RegisterNatives() return error\n", __FILE__, __LINE__, name);
abort();
}
jniOnLoad((GoUintptr) vm);
return JNI_VERSION_1_6;
}
void JNI_OnUnload(JavaVM *vm, void *reserved) {
jniOnUnload((GoUintptr) vm);
}libs.go:
package main
//
// #include <stdlib.h>
// #include <stddef.h>
// #include <stdint.h>
import "C"
//export jniOnLoad
func jniOnLoad(vm uintptr) {
// TODO
}
//export jniOnUnload
func jniOnUnload(vm uintptr) {
// TODO
}
//export jni_edu_buaa_nativeHello1
func jni_edu_buaa_nativeHello1(env uintptr, clazz uintptr) {
// TODO
}