Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Herramienta de generación de código de plantilla de Go para JNI, lo que facilitar la comunicación entre Java y Go.

Notifications You must be signed in to change notification settings

nuloperrito/GoJNIGenerator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GoJNIGenerator

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.

Limitaciones de funcionalidad

  • Actualmente, solo admite la resolución de un único archivo fuente de Java.
  • No admite importaciones con *.

Uso

gojni xxx.java

Ejemplo

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
}

About

Herramienta de generación de código de plantilla de Go para JNI, lo que facilitar la comunicación entre Java y Go.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages