Skip to content

[Native Image] 编译出来的共享库好像跟windowsgui有冲突 #11323

Closed
@bert1020

Description

@bert1020

Describe the Issue

我在使用go(wails库)做一个桌面客户端软件, 调用编译出来的共享库时,我想把GraalIsolateThread共享出来,不用每次调用都创建GraalIsolateThread,最重要的是我使用go打包的时候启用了windowsgui ,
go build -tags desktop,production -gcflags "all=-N -l" -ldflags "-H windowsgui"
如果不使用这个windowsgui 命令,就没问题,只要添加这个命令就会出问题,这个命令会隐藏掉cmd控制台命令框.
我不想启动了我的桌面客户端软件的同时 还显示一个cmd控制台命令框在那里

Using the latest version of GraalVM can resolve many issues.

GraalVM Version

java version "24.0.1" 2025-04-15
Java(TM) SE Runtime Environment Oracle GraalVM 24.0.1+9.1 (build 24.0.1+9-jvmci-b01)
Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 24.0.1+9.1 (build 24.0.1+9-jvmci-b01, mixed mode, sharing)

Operating System and Version

Windows11

Troubleshooting Confirmation

Run Command

native-image --shared -H:Name=dll/Knx.Sdk -H:+UnlockExperimentalVMOptions --enable-native-access=ALL-UNNAMED -H:+JNI -J-Xss8m -H:+ReportExceptionStackTraces -H:IncludeResources=org/usb4java/win32-x86-64/libusb4java.dll -H:ConfigurationFileDirectories=./config --initialize-at-build-time=com.seawin.KnxSdk -cp target/knx-sdk-1.0.jar

Expected Behavior

我在使用go(wails库)做一个桌面客户端软件, 调用编译出来的共享库时,我想把GraalIsolateThread共享出来,不用每次调用都创建GraalIsolateThread,最重要的是我使用go打包的时候启用了windowsgui ,
go build -tags desktop,production -gcflags "all=-N -l" -ldflags "-H windowsgui"
如果不使用这个windowsgui 命令,就没问题,只要添加这个命令就会出问题,这个命令会隐藏掉cmd控制台命令框.
我不想启动了我的桌面客户端软件的同时 还显示一个cmd控制台命令框在那里

Actual Behavior

通过以上共享后,在其他函数中使用GraalIsolateThread的时候报错The handle is invalid

Steps to Reproduce

我先执行InitSdkDll函数,再去执行SearchServers的result, _, err1 := proc.Call(uintptr(unsafe.Pointer(thread)))
这一步就报错

var (
	sdkDll  *syscall.DLL
	thread  *GraalIsolateThread
)

func InitSdkDll() error {
	dll, err := syscall.LoadDLL("Knx.Sdk.dll")
	if err != nil {
		return fmt.Errorf("DLL load failed: %w", err)
	}
	sdkDll = dll

	proc, err := dll.FindProc("graal_create_isolate")
	if err != nil {
		return fmt.Errorf("proc not found: %w", err)
	}

	params := &GraalCreateIsolateParams{Version: 4}
	var isolate *GraalIsolate
	ret, _, _ := proc.Call(
		uintptr(unsafe.Pointer(params)),
		uintptr(unsafe.Pointer(&isolate)),
		uintptr(unsafe.Pointer(&thread)),
	)
	if ret != 0 {
		return errors.New("isolate creation failed")
	}
	return nil
}

func SearchServers() (string, error) {
	if thread == nil {
		return "", errors.New("thread not initialized")
	}

	proc, err := sdkDll.FindProc("SearchKnxServers")
	if err != nil {
		return "", fmt.Errorf("proc not found: %w", err)
	}

	result, _, err1 := proc.Call(uintptr(unsafe.Pointer(thread)))
	if err1 != nil && err1 != syscall.Errno(0) {
		return "", fmt.Errorf("API call failed: %w", err1)
	}

	return C.GoString((*C.char)(unsafe.Pointer(result))), nil
}

Additional Context

No response

Run-Time Log Output and Error Messages

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions