本文参照了以下作者博文:
https://blog.youkuaiyun.com/RZTUSHU1/article/details/133126506
–add-stdcall-alias
由于go 不支持 std 压栈 stdcall
所以要变换一个方法,套一次 C语言
用gcc 打包 即可,先把go 代码中方法换成 共享库,再有C 调用共享库 linux 为.so ,windows 为 dll ,
gcc -m32 -c -o mydll.o mydll.c
gcc -m32 -c -o run.o run.c
-m32 参数为强制编程win32 api
gcc -shared -m32 -o mydll.dll mydll.o -Wl,–kill-at
Go代码 (example.go):
package main //export Addfunc Add(a int, b int) int { return a + b} func main() { // 这里的代码仅用于编译生成C可调用的库}
C代码 (main.c):
#include <stdio.h> // 声明Go函数,cgo会处理这些声明extern int Add(int, int); int main() { int result = Add(2, 3); printf(“Result: %d\n”, result); return 0;}
编译步骤:
1.编译Go代码生成共享库:
linux :
go build -buildmode=c-shared -o libexample.so example.go
windows:
go build -buildmode=c-shared -o libexample.dll example.go
2.编译C代码链接Go的共享库:
gcc -o main main.c -L. -lexample
gcc -c -m32 -o zhangxin.o zhangxin.c -L. -lexample
-----------第一步:打包go 中函数 变为 libexample.dll
-----先查看go env 环境
用CMD 非管理员 即可
64位golang 打包成32位 dll
set GOARCH=386
set CGO_ENABLED=1
go build -buildmode=c-shared -o libexample.dll main.go
- go build -ldflags="-H windowsgui -w -s" -buildmode=c-shared -o libexample.dll getcpuid.go
- go build -ldflags="-H windowsgui -w -s" -buildmode=c-shared -o libexample.dll main.go
- go build -ldflags="-H windowsgui -w -s" -buildmode=c-shared -o main.dll getcpuid.go
-----------第一步:打包go 中函数 ---------
第二步 64红色部分,32位蓝色部分
转为 .o 文件
gcc -c -m32 -o zhangx.o zhangx.c -L. -lexample
gcc -c -m64 -o zhangx.o zhangx.c -L. -lexample
把 .o 文件 生成为dll 文件
gcc -shared -m32 -o zhangx.dll zhangx.o -Wl,–kill-at -L. -lexample
gcc -shared -m64 -o zhangx.dll zhangx.o -Wl,–kill-at -L. -lexample
第二步 红色部分
3.运行C程序:
./main
请确保你的Go环境已经正确安装,并且你的系统支持cgo。这个例子在Linux上测试通过,在其他系统上可能需要相应的调整。
提示:AI自动生成,仅供参考
java 调用动态库的方法
char* __stdcall test(char* strUrl,char* InData,char* OutData)
https://www.cnblogs.com/caoleiCoding/p/12949048.html
public class DllTest {
static {
String filePath = “D:\dll”; // 这里是你的动态库所在文件夹的绝对路径
// 这里引用动态库和他的依赖
System.load(filePath + “mfc100.dll”);
System.load(filePath + “mydll.dll”);
}
public static void main(String[] args) {
String strUrl = “http://127.0.0.1/test”;
String InData = “{“data”:{“operatorId”:“test001”,“operatorName”:“超级管理员”,“orgId”:“123”},“orgId”:“1232”}”;
byte[] OutData = new byte[1024];
String msg = CLibrary.INSTANCE.test(strUrl.getBytes(), InData.getBytes(), OutData);
System.out.println(msg);
try {
System.out.println(new String(OutData, "GBK"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
// 这里是最关键的地方
public interface CLibrary extends Library {
// FS_CheckCode是动态库名称,前面的d://test//是路径
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(“mydll”, CLibrary.class);
// 我们要调用的动态库里面的方法。
String test(byte[] strUrl, byte[] InData, byte[] OutData);
}
}
if err != nil {
fmt.Printf(“⚠️ 调用异常: %v\n”, err)
return
}
2382

被折叠的 条评论
为什么被折叠?



