亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試編譯 Go 共享對象以通過 JNI 從 Java 調用時出錯

嘗試編譯 Go 共享對象以通過 JNI 從 Java 調用時出錯

Go
慕碼人2483693 2022-08-09 20:11:55
我正在嘗試通過JNI調用從Java調用Go函數。Java編譯是可以的。當我嘗試構建Go共享對象(.so)時,它給我帶來了關于可從Java調用的C函數包裝器的“多個定義”的錯誤。這是Java代碼:package yada.yada.locksmith;import java.io.*;public class Locksmith {   private native void setup(String ClientID, String ClientSecret, String RedirectURL, String AuthURL, String TokenURL, String UserInfURL);   private native String auth(String user, String pw);   static {      System.loadLibrary("Locksmith");   }   public static void Locksmith(String[] args) {      Locksmith locksmith = new Locksmith();      locksmith.setup(         "yadayadayadayadayadayadayadayadayadayada",         "yadayadayadayadayadayadayadayadayadayada",         "https://yada.yada/Yada/yada",         "https://yada.yada/Yada/yada2",         "https://yada.yada/Yada/yada3",         "https://yada.yada/Yada/yada4"      );      // Create the console object      Console cnsl = System.console();      if (cnsl == null) {         System.out.println("No console available");         return;      }      String user = cnsl.readLine("Enter username : ");      char[] pw = cnsl.readPassword("Enter password : ");      System.out.println(locksmith.auth(user,new String(pw)));   }}我用以下公式編譯它:javac Locksmith.java然后我生成了頭文件:javac -h .鎖匠.java這是生成的文件:/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class yada_yada_locksmith_Locksmith */#ifndef _Included_yada_yada_locksmith_Locksmith#define _Included_yada_yada_locksmith_Locksmith#ifdef __cplusplusextern "C" {#endif/* * Class:     yada_yada_locksmith_Locksmith * Method:    setup * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_yada_yada_locksmith_Locksmith_setup  (JNIEnv *, jobject, jstring, jstring, jstring, jstring, jstring, jstring);
查看完整描述

1 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

cgo 文檔中的以下問題是:


在文件中使用 //export 會對前導碼施加限制:由于它被復制到兩個不同的 C 輸出文件中,因此它不能包含任何定義,只能包含聲明。如果文件同時包含定義和聲明,則兩個輸出文件將生成重復的符號,并且鏈接器將失敗。為避免這種情況,必須將定義放在其他文件的序言中,或放在 C 源文件中。


移動線條


extern void Setup(char *, char *, char *, char *, char *, char *);

extern char *Auth(char *, char *);

到 該文件和 C 定義將生成以下成功構建的前導碼:locksmith.hlocksmith.c


/*

#cgo CFLAGS: -I/usr/local/bin/jdk-15.0.1/include -I/usr/local/bin/jdk-15.0.1/include/linux


#include "locksmith.h"

*/

import "C"

的開頭將包含以下內容:locksmith.c


#include <string.h>

#include <jni.h>        // JNI header provided by JDK

#include "locksmith.h"

#include "yada_yada_locksmith_Locksmith.h"

此外,構建命令需要只是


go build -o liblocksmith.so -buildmode=c-shared

沒有在最后。locksmith.go


查看完整回答
反對 回復 2022-08-09
  • 1 回答
  • 0 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號