Язык GO использует JNI для вызова функций в пакете JAVA Code CodeJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Язык GO использует JNI для вызова функций в пакете JAVA Code Code

Сообщение Anonymous »

Ниже приводится мое использование инструмента JNI in go, чтобы вызвать пакет Java Jar, ниже приведены программы кода Java и GO, а также ошибку времени выполнения.package com.example.demo;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.digest.HMac;

public class MyTest {
public static String test(String secretKey){
HMac mac = SecureUtil.hmacSha256(secretKey);
String digestHex = mac.digestHex("spliceValue", CharsetUtil.CHARSET_UTF_8);
String signature = digestHex.toUpperCase();
return signature;
}

}
< /code>
Go Code: < /p>

package main

/*
#include
*/
import "C"

import (
"fmt"
"github.com/timob/jnigi"
"log"
"runtime"
)

func main() {
fmt.Println("load JVM...")
jvmPath := jnigi.AttemptToFindJVMLibPath()
fmt.Printf("JVM path: %s\n", jvmPath)

if err := jnigi.LoadJVMLib(jvmPath); err != nil {
log.Fatal("JVM load err:", err)
}
fmt.Println("JVM load success!")

runtime.LockOSThread()
defer runtime.UnlockOSThread()

classpath := "/test/app/engine-test/demo.jar:/test/app/engine-test/hutool-all-5.8.25.jar:/test/app/engine-test/bcprov-jdk18on-1.78.jar"
fmt.Printf("Classpath: %s\n", classpath)

jvmArgs := jnigi.NewJVMInitArgs(false, false, jnigi.DEFAULT_VERSION,
[]string{
"-Djava.class.path=" + classpath,
"-Xmx512m",
"-Xms256m",
})

jvm, env, err := jnigi.CreateJVM(jvmArgs)
if err != nil {
log.Fatal("err:", err)
}
fmt.Println("JVM success!")
defer jvm.Destroy()

secretKey := "mySecretKey123"

secretKeyParam, err := env.NewObject("java/lang/String", []byte(secretKey))
if err != nil {
log.Fatal("secretKe err:", err)
}

class, err := env.FindClass("com/example/demo/MyTest")
if err != nil {
fmt.Printf(" ------FindClass: %v\n", err)
}
var tt jnigi.ObjectRef
err = class.CallMethod(env, "test", &tt, secretKeyParam)
if err != nil {
fmt.Printf(" ------class.CallMethod: %v\n", err)
}

var goString string
if err := tt.CallMethod(env, "toString", &goString); err != nil {
fmt.Printf(" ewrr: %v\n", err)
} else {
fmt.Printf(" return: %s\n", goString)
}

}
< /code>
Запустите эту демонстрацию : < /p>
f205b1f5592f:/test/app/engine-test# ./main
load JVM...
JVM path: /opt/java/openjdk/lib/server/libjvm.so
JVM load success!
Classpath: /test/app/engine-test/demo.jar:/test/app/engine-test/hutool-all-5.8.25.jar:/test/app/engine-test/bcprov-jdk18on-1.78.jar
JVM success!
Exception in thread "main" java.lang.NoSuchMethodError: test
------class.CallMethod: Java exception occurred. check stderr/logcat
ewrr: JNIGI: unknown type *string (value = 0xc000014060)



Подробнее здесь: https://stackoverflow.com/questions/797 ... ar-package
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»