Используйте JNA для вызова DLLS, которые имеют проблемы с зависимостями, сообщение об ошибке Неверный доступ к памятиC#

Место общения программистов C#
Ответить
Anonymous
 Используйте JNA для вызова DLLS, которые имеют проблемы с зависимостями, сообщение об ошибке Неверный доступ к памяти

Сообщение Anonymous »

Я создал две библиотеки dll на C#: shuchu.dll И yinyong.dll
Содержимое shuchu dll

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

namespace shuchu
{
public class Class1
{

[DllExport("getInfo", CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]
public static String GetInfo() {
return "A1B2C3";
}
}
}
Содержимое библиотеки yinyong dll

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

namespace yinyong
{
public class Ying
{
[DllExport("getShuChuInfo", CallingConvention = CallingConvention.Cdecl)]
public static string GetShuChuInfo()
{
return Class1.GetInfo();
}

[DllExport("getNormalInfo", CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]
public static string GetNormalInfo(string info)
{
return info;
}
}
}
Вызов GetShuChuInfo в yingyong.dll GetInfo в shuchu.dll ничего не делает и возвращает информацию о вызывающем методе?
Они все используют в автономном режиме. DllExport. 1.7.4.29 инструменты для создания функций, все библиотеки DLLS 64-разрядные.
Это мой Java-код

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

public class NuoWenTest {

private static String basePath = "D:\\WorkSpace\\EclipseWorkSpace\\HC_Exmple\\NuoWen";

public interface NewtonsoftJsonDll extends Library {
NewtonsoftJsonDll INSTANCE = Native.load("shuchu.dll",NewtonsoftJsonDll.class, W32APIOptions.ASCII_OPTIONS);

String getInfo();
}

public interface Dll extends Library {
NewtonsoftJsonDll INSTANCE = NewtonsoftJsonDll.INSTANCE;
Dll dll = (Dll) Native.synchronizedLibrary(Native.load("yinyong.dll", Dll.class, W32APIOptions.ASCII_OPTIONS));

String getShuChuInfo();

String getNormalInfo(String info);

}

public static void main(String[] args) {

System.setProperty("jna.debug_load", "true");
System.setProperty("jna.debug_load.jna", "true");
System.setProperty("jna.library.path", basePath);
System.out.println(System.getProperty("os.arch"));
System.setProperty("jna.encoding", "GBK");

String value = "inputValue";
String normalInfo = Dll.dll.getNormalInfo(value);
System.out.println(normalInfo);
String shuChuInfo = Dll.dll.getShuChuInfo();
System.out.println(shuChuInfo);

}
}
Результат выполнения

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

amd64
一月 10, 2025 1:32:31 下午 com.sun.jna.Native extractFromResourcePath
信息: Looking in classpath from sun.misc.Launcher$AppClassLoader@18b4aac2 for /com/sun/jna/win32-x86-64/jnidispatch.dll
一月 10, 2025 1:32:31 下午 com.sun.jna.Native extractFromResourcePath
信息: Found library resource at jar:file:/D:/maven/localRepository/net/java/dev/jna/jna/5.12.1/jna-5.12.1.jar!/com/sun/jna/win32-x86-64/jnidispatch.dll
一月 10, 2025 1:32:31 下午 com.sun.jna.Native extractFromResourcePath
信息: Extracting library to C:\Users\PC\AppData\Local\Temp\jna-2547\jna7403058685325327933.dll
一月 10, 2025 1:32:31 下午 com.sun.jna.Native loadNativeDispatchLibraryFromClasspath
信息: Trying C:\Users\PC\AppData\Local\Temp\jna-2547\jna7403058685325327933.dll
一月 10, 2025 1:32:31 下午 com.sun.jna.Native loadNativeDispatchLibraryFromClasspath
信息: Found jnidispatch at C:\Users\PC\AppData\Local\Temp\jna-2547\jna7403058685325327933.dll
一月 10, 2025 1:32:31 下午 com.sun.jna.NativeLibrary loadLibrary
信息: Looking for library 'shuchu.dll'
一月 10, 2025 1:32:31 下午 com.sun.jna.NativeLibrary loadLibrary
信息: Adding paths from jna.library.path: D:\WorkSpace\EclipseWorkSpace\HC_Exmple\NuoWen
一月 10, 2025 1:32:31 下午 com.sun.jna.NativeLibrary loadLibrary
信息: Trying D:\WorkSpace\EclipseWorkSpace\HC_Exmple\NuoWen\shuchu.dll
一月 10, 2025 1:32:31 下午 com.sun.jna.NativeLibrary loadLibrary
信息: Found library 'shuchu.dll' at D:\WorkSpace\EclipseWorkSpace\HC_Exmple\NuoWen\shuchu.dll
一月 10, 2025 1:32:31 下午 com.sun.jna.NativeLibrary loadLibrary
信息: Looking for library 'yinyong.dll'
一月 10, 2025 1:32:31 下午 com.sun.jna.NativeLibrary loadLibrary
信息: Adding paths from jna.library.path: D:\WorkSpace\EclipseWorkSpace\HC_Exmple\NuoWen
一月 10, 2025 1:32:31 下午 com.sun.jna.NativeLibrary loadLibrary
信息: Trying D:\WorkSpace\EclipseWorkSpace\HC_Exmple\NuoWen\yinyong.dll
一月 10, 2025 1:32:31 下午 com.sun.jna.NativeLibrary loadLibrary
信息: Found library 'yinyong.dll' at D:\WorkSpace\EclipseWorkSpace\HC_Exmple\NuoWen\yinyong.dll
inputValue
Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokePointer(Native Method)
at com.sun.jna.Function.invokePointer(Function.java:497)
at com.sun.jna.Function.invokeString(Function.java:660)
at com.sun.jna.Function.invoke(Function.java:434)
at com.sun.jna.Function.invoke(Function.java:361)
at com.sun.jna.Library$Handler.invoke(Library.java:265)
at com.sun.jna.Native$3.invoke(Native.java:1252)
at com.sun.proxy.$Proxy1.getShuChuInfo(Unknown Source)
at com.kaimingyun.iccard.controller.NuoWenTest.main(NuoWenTest.java:37)
При вызове getNormalInfo об ошибках не сообщается, только если существует метод, вызывающий внешнюю dll.
Версия Java — 1.8, версия JNA — 5.12. .1 с использованием Windows 11, процессор i7-12700k, 32 ГБ ОЗУ
Думаю, ошибка возникает из-за отношений зависимости, но я прочитал несколько статей, чтобы решить ее без никакого эффекта. И выходная информация в журнале показала, что они были загружены нормально.
Я пытался изменить тип возвращаемого значения метода getShuChuInfo() на WString и Pointer, но они оба вернуть ту же ошибку.

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

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

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

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

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

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