JNA-Windows аварийно завершает работу кучи памяти при попытке освободить памятьJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JNA-Windows аварийно завершает работу кучи памяти при попытке освободить память

Сообщение Anonymous »

У меня есть простая программа на Go, созданная как общая библиотека, которую можно импортировать в Java с помощью JNA и вызывать определенную функцию.
Вот мой код на golang:

Код: Выделить всё

package main

import (
"C"
)
import (
regexp "github.com/wasilibs/go-re2"
)

//export Matches
func Matches(input *C.char, regex *C.char) *C.char {
var re *regexp.Regexp

regexBytes := []byte(C.GoString(regex))
regexClone := string(regexBytes[:])

re, _ = regexp.Compile(regexClone)

match := re.MatchString(C.GoString(input))

if match {
return C.CString("1")
} else {
return C.CString("0")
}
}

func main() {}

Код очень прост: я использую Re2 для выполнения Regex, потому что у меня лучшая производительность, чем у Java — мое приложение широко использует Regex.
А для сборки DLL я установил tdm64-gcc и использовал команду:

Код: Выделить всё

go build -buildmode=c-shared -o lib/libcustom.dll .\custom.go
Я провел множество тестов производительности в ОС Unix, и код Java работает очень хорошо, без каких-либо сбоев. Теперь я создал библиотеку Windows DLL, позволяющую другим пользователям запускать программу локально, и она начала давать сбой сразу при попытке освободить память:

Код: Выделить всё

package com.example.demo;

import com.example.demo.jna.regex.RegexLibrary;

import com.sun.jna.NativeLibrary;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

public class DemoApplication {

public static void main(String[] args) {
NativeLibrary.addSearchPath("custom", "C:\\Users\\placplac\\github\\test-golang\\lib");
Pointer pr = RegexLibrary.INSTANCE.Matches("1", "[0-9]");
boolean match = pr.getString(0).matches("1");
Native.free(Pointer.nativeValue(pr));
}

}

----

package com.example.demo.jna.regex;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

public interface RegexLibrary extends Library {
RegexLibrary INSTANCE = Native.load("custom", RegexLibrary.class);

Pointer Matches(String input, String regex);
}

Я работаю локально в своей Windows, и результат сопоставления всегда правильный, независимо от того, что я передаю. Это любопытно, потому что команда Native.free(Pointer.nativeValue(pr)); приводит к сбою моей программы с кодом завершения 0xC0000374, который связан с повреждением кучи, и я не вижу, чтобы эта ошибка происходила в Unix OS или OSX.
Простой обходной путь: запускайте Native.free(Pointer.nativeValue(pr)) только в ОС Unix, потому что я Знайте, что ОС Windows предназначена только для локальной разработки.
Кто-нибудь знает, почему это происходит только в Windows?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ree-memory
Ответить

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

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

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

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

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