JNA: java.lang.Error: 无效的内存访问
我正在使用 jna 访问Java的某些 dll 函数,此DLL本机函数被声明为以下内容: // it returns (long) H264_Login (char *sIP, unsigned short wPort, char *sUserName, char *sPassword, LP_DEVICEINFO lpDeviceInfo, int *error); // where LP_DEVICEINFO is a struct 所以,我将其在库界面中声明如下: long H264_Login(String sIP, short wPort, String sUserName, String sPassword, Structure DeviceDate, int error); ,然后我称其为以下方式: simpleDLL INSTANCE = (simpleDLL) Native.loadLibrary(
32 2024-04-26
编程技术问答社区
Java中与IntPtr(C#)相当的是什么?
在Java(JNA)中相当于Intptr(C#)的等效内容? 解决方案 com.sun.jna.ptr.IntByReference 其他解决方案 我希望那是com.sun.jna.ptr.ByReference或其混凝土子类型之一.
14 2024-04-16
编程技术问答社区
让JNA与Java => C#一起工作?
我已经在C#库中写了很多代码,我现在需要从Java打电话. 我看到它建议使用 jna ,但是我遇到的甚至很难摆脱起点块;那里的文档很粗略. 首先,它似乎仅向您展示如何连接到本机C库,这对我不好.我想连接到自己的库.那里的代码示例显示: // This is the standard, stable way of mapping, which supports extensive // customization and mapping of Java to native types. public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
14 2024-04-13
编程技术问答社区
如何使用JNA库在Java中使用C#函数
我花了很多时间尝试在我的Java应用程序中使用C#功能,但没有成功... 我在C#中写下了以下lib: public class Converter { public Converter() { } public bool ConvertHtmlToPdf(String directoryPath) { //DO SOMETHING } } 此dll调用另一个DLL来进行一些操作,但是当我编译时,我可以在我的Realse文件夹中找到DLL,并且一切似乎都可以,因此我使用32bit选项,64位和任何CPU选项对其进行了编译,以确保这不是我的问题. 用 depentency walker 在32位和任何CPU选项中,将我的dll文件分配给我的dll文件.找到并显示此消息: 警告:至少找不到一个延迟加载依赖模块. 警告:至少一个模块由于在延迟加载依赖模块中缺少导出功能而具有未解决的导入. 它不会发生
10 2024-04-13
编程技术问答社区
JNA ByteBuffer statvfs
我正在尝试使用Java的statvf呼叫在/文件夹上获取可用空间, 我从C中检查了STATVFS struct的大小,显示了44个字节,我使用Java.nio.nio.bytebuffer.alcatedirect 44个字节分配了一个字节缓冲区,并且其订单设置为44个字节. 当我致电statvfs时,我的返回值为0,所以我假设呼叫成功,但是我似乎无法使用buffer从字节中获取信息.getint返回512 f_bsize这是正确的,但是在那之后我无法阅读. buffer.getint(12)应该给我f_blocks,但我得到0. unsigned long f_bsize; /* File system block size */ unsigned long f_frsize; /* Fundamental file system block size */ fsblkcnt_t f_blocks; /* Blocks on FS in uni
14 2024-04-10
编程技术问答社区
Java本地访问代码错误。"无效的内存访问"
我可以访问test.h and test.so文件: test.h int insert_data(void *location_data, uint64_t device_id, uint64_t event_id, uint64_t motion_seq, uint64_t utc_time, uint32_t sensor_seq, uint32_t device_seq, uint32_t tick_mark, uint16_t ble, int movement, int path_id); 我现在正在写JNA代码以调用上述方法. interface TestCLibrary extends Library { TestCLibrary INSTANCE = (TestCLibrary) Native.loadLibrary(“test”, TestCL
16 2024-04-10
编程技术问答社区
JNA 写入stdout时无效的内存访问
我正在为C库编写JNA包装,并在Cygwin下使用GCC编辑.根据我执行JNA包装器的方式,Java应用程序要么悬挂(如果在Eclipse下执行为单位测试),或者以无效的内存异常终止.问题似乎只有C库为Stdout或Stderr写了一些东西. 这是我的最小(非)工作示例: add.c #include int add (int x, int y) { fprintf(stdout, "hello world\n" ); return x + y; } JNA包装器 public interface Add extends Library { Add INSTANCE = (Add) Native.loadLibrary("add", Add.class); int add(int x, int y); } 在Cygwin下编译C文件如下: gcc -g -Wall -c add.c gcc -share
28 2024-04-09
编程技术问答社区
JNA指向无符号字符*的指针
我有一个字节数组,我想使用JNA将其传递给C函数. 但是,我只找到了使用新内存和使用的写入功能来复制数组数据的指针的示例,但对我来说是不可接受的,因为我有很大的数据块. 是否有可能直接将我的Java数组直接传递到C库? 我想做这样的事情: MyLib lib = Native.loadLibrary("test"); Pointer p = myByteArray; //I want to make it possible lib.someFunction(p); 解决方案 将原始数组或Pointer传递给内存是等效的操作,即您可以这样映射: public interface MyLibrary extends Library { void someFunction(byte[] input); void someFunction(Pointer input); }
18 2024-04-09
编程技术问答社区
在JNA中获得一个由参数返回的不透明结构
我正在尝试在Apple的Security.h框架中调用一种方法,该框架通过引用返回结构,例如: int findSomething(SomeStruct *s) (具体来说,是interface SomeLib extends Library { int findSomething(Pointer p); } ... Pointer p = ... // Not sure how to make this nativeLib.findSomething(p) // Do something with p 如果我可以在Java中做sizeof(SomeStruct),我认为我可以使用JNAS Memory创建指针.我可以写一个本机方法以返回sizeof(SomeStruct),但我不想在我自己的代码中添加本机组件. 这类似于这个问题 SomeStruct的字段在运行时已知,而在我的情况下,图书馆作者故意掩盖了字段. 解决方案 SecKeychainItemRe
22 2024-04-09
编程技术问答社区
JNA:如何处理不知名的结构?
如果我没记错的话,a 例如: /* native code */ typedef struct mystruct { int x; float y; } mystruct; void dosomething(mystruct * s) { s->y += s->x; } 和java: ... callFunctionWithSt("dosomething", new Object[]{Integer.valueOf(2),Float.valueOf(3.0)}); ... void callFunctionWithSt(String funcName, Object[] structVals) { NativeLibrary nl = ... Pointer arg = ... // or Memory ... or Structure // build structure
18 2024-04-09
编程技术问答社区
Pragma Pack使用C库导致jvm崩溃
我使用JNA在我的Java代码中使用了C库.我有这些C结构的成员需要在Java上打印.由于内存的对齐和填充,大小与我实际期望的不同.因此,我使用了Pragma Pack,这就是结构现在的样子. #define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) ) PACK( typedef struct { size_t size; uint8_t bytes[48]; } ipj_tid_t); PACK( typedef struct { bool has_epc; //1 ipj_epc_t epc; //64+8 bool has_tid; //1 ipj_tid_t tid; //48+8 bool has_pc; //1 uint32_t pc; //4 bool ha
16 2024-04-09
编程技术问答社区
用JNA将数组从java传给dll函数
我想将java数组作为参数传递给c dll jna, 这是我的代码: import com.sun.jna.*; public class Javatest { public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary( "test", CLibrary.class); void test(Pointer p,int width); } public static void main(String[] args) { Pointer p = new Memory(5*Native.getNativeSize(Double.TYPE)); for (int i = 0; i
18 2024-04-09
编程技术问答社区
Java JNA UCHAR和PUCHAR
我希望将一个Java字符串放到' wlanhostednetworksetsecondarykey '和' wlanhostednetworksetsetproperty '.一个人想要一个带有char []的结构内的结构,第一个想要一个puchar.我尝试使用 string,char [],byte []和内存,但是它们会继续产生相同的错误(第一个参数或不良配置文件的内容).有什么方法可以与JNA进行更多调试(可能不是:()? 我也无法阅读任何使用的字符编码的任何地方,除了不是ANSI.任何帮助都很好! * DWORD WINAPI WlanHostedNetworkSetSecondaryKey( __in HANDLE hClientHandle, __in DWORD dwKeyLength, __in PUCHAR pucKeyData, __in
14 2024-04-09
编程技术问答社区
JNA的简单函数调用在Linux(x64)上工作,但在Windows(x86)上不工作
我正在尝试使用JNA从Java运行以下C函数,但是我在X86 Windows(dll)上获得了错误(无效的内存访问),但在x64 linux(.so)中却没有. C功能 char* testcopy(char* out,char* in) { strcpy(out,in); free(in); return out; }; C测试:在两个平台(Eclipse CDT/MVC ++)中工作 当函数通过Linux共享库或Windows DLL暴露并直接在C中调用时,结果是可以的. ... char out[10]; char* res; char* in = (char*)malloc(3*sizeof(char)); strcpy(in,"ab"); res = testcopy(out,in); fprintf(stdout,"out: %s\n",out); fprintf(stdout,"res: %s\n",res); retu
20 2024-04-09
编程技术问答社区
有没有一种工具可以为Delphi(Win32)DLLs创建C头文件?
到目前为止,我只看过但是,在" Delphi First"情况下,有一个Delphi接口声明和一个生成的DLL,没有C标头.是否有可以提取必要信息并为DLL构建C标头文件的工具? 这样的工具可能会有所帮助,并且可以在跨语言/跨平台项目中节省时间.例如,使用C标头文件,使用 delphi源 - >创建C头 - >转换为Java绑定 - >使用Java 使用Delphi Dll 解决方案 使用-jphne参数. 其他解决方案 虽然从理论上起作用,但许多Delphi DLL将使用呼叫惯例,例如注册,不要以标准C方式打包记录等.然后最重要的是有RTL问题,协作者状态词词等. 可能大多数C编译器都可以通过添加一些Pragma的方法解决方法,但我怀疑整个Java绑定的东西会吃掉. 因此,除非dll构成了这一点,否则这可能会奏效的频率不超过它. 阅读和解析Delphi标题并不难.帕斯卡(Pascal)比例如C. fpc(免费pascal)有一个用于其文档工具的Pasc
18 2024-04-08
编程技术问答社区
Security.h中结构的macOS文档
我正在尝试通过Java和JNA使用Security.h MacOS框架.这意味着我需要将某些结构重建为Java类. 问题是,当我查看struct的文档时(例如,一个),我所看到的只是对结构的简短描述,而没有提及其字段.我在哪里可以在Apple的文档中获取结构的完整描述? 解决方案 为了快速查看,您可以在您得到了: typedef struct CF_BRIDGED_TYPE(id) SECTYPE(SecKeychainItem) *SecKeychainItemRef; 因此,您可能需要其他标头来跟踪结构的确切字段.更好的方法是将XCode与所需的操作系统一起安装XCode,您将在本地系统上找到标题.例如: $ ls /Applications/Xcode.app/Contents/Developer/Platforms/*.platform/Developer/SDKs/*.sdk/System/Library/Frameworks/Security.f
14 2024-04-08
编程技术问答社区
有没有一种工具可以为Delphi(Win32)DLLs创建C头文件?
到目前为止,我只看过但是,在" Delphi First"情况下,有一个Delphi接口声明和一个生成的DLL,没有C标头.是否有可以提取必要信息并为DLL构建C标头文件的工具? 这样的工具可能会有所帮助,并且可以在跨语言/跨平台项目中节省时间.例如,使用C标头文件,使用 delphi源 - >创建C头 - >转换为Java绑定 - >使用Java 使用Delphi Dll 解决方案 使用-jphne参数. 其他解决方案 虽然从理论上起作用,但许多Delphi DLL将使用呼叫惯例,例如注册,不要以标准C方式打包记录等.然后最重要的是有RTL问题,协作者状态词词等. 可能大多数C编译器都可以通过添加一些Pragma的方法解决方法,但我怀疑整个Java绑定的东西会吃掉. 因此,除非dll构成了这一点,否则这可能会奏效的频率不超过它. 阅读和解析Delphi标题并不难.帕斯卡(Pascal)比例如C. fpc(免费pascal)有一个用于其文档工具的Pasc
20 2024-04-08
编程技术问答社区
指向作为JNA方法参数的结构数组的指针
我正在尝试通过 sctpdrv 库来创建JNA实现.我的问题是,我没有让指针构造阵列.我试图搜索解决方案,但是它们与我需要知道的始终略有不同. JNA dokumentation仅显示一个指向原始类型数组的指针的示例.似乎也有不同的方式来做到这一点. int WSAAPI internal_sctp_getpaddrs (SOCKET, sctp_assoc_t, struct sockaddr **); void WSAAPI internal_sctp_freepaddrs (struct sockaddr *); 根据文档,GetPaddrs的第三个参数用于返回sockaddr结构的数组.声明相应的JNA方法的推荐方法是什么,我该如何准备该论点,以及在我的Java代码中呼叫后访问它? 另外,为了帮助我理解,我将如何声明和使用一个函数,而参数是包含指针的数组? 解决方案 // Declare the SOCKADDR struct public class
18 2024-04-08
编程技术问答社区
JNI对JNA的表现
我们有一个使用GPU(OPENCL)的本机c/asm使用特定方法的大数据进行应用程序,它只是完美的,没问题.项目的一部分(Web和Distribution)是由JEE开发的,我们只需要致电本机应用程序/库. 我们试图使用Process类称其为分离的外部过程.问题是我们无法控制应用程序(事件,处理程序,线程等).我们还试图将C代码切换为Java代码,但性能消失了.除了运行本机代码作为过程,我正在考虑JNA和JNI,但是有一些问题. 问题: 为了更好(更快)读/写入解决方案,是否可以通过JNI和JNA中的直接(未管理)内存[Java(ByteBuffer#allocateDirect())]交换数据? 是否可以通过本机代码管理和处理过程,并通过Java代码(OPENCL LIB)访问GPU(共享)内存? 表现呢? JNA比JNI快吗? 我们在Redhat Linux6 x64上有两个AMD W7000聚类设备. 解决方案 JNA比JNI慢得多,但要容易得多
16 2024-04-07
编程技术问答社区
在jna中返回和访问结构对象的数组
我有一个结构,该结构包含C: 中的一些字符指针 struct inputsheet { char* TestCaseID[MAX_TEST_CASES]; char* Description[MAX_TEST_CASES]; }; 我的函数是返回结构对象的数组: struct inputsheet* getapi(char *docname); 现在我想在Java中使用它.如何处理这种结构的对象?我能够处理一个对象,但不能处理数组. 对于单个对象,我在C中的代码在这里: public class str3 extends com.sun.jna.Structure implements com.sun.jna.Structure.ByReference { public Pointer a1; public Pointer b2; public Pointer c3[]=new Pointer[10]; } 访问它
14 2024-04-07
编程技术问答社区