Tag: jna

JNA数据返回到预期的第16个字节

我期待在内存中的数据是 [8 Bytes (long)][20 Bytes (byte[20])][8 Bytes (long)][20 Bytes (byte[20])][8 Bytes(long)][20 Bytes (byte[20])] 数据结构似乎是正确的。 问题是结构中的数据是错误的。 预期数据的第一个字节实际上是第9个字节。 前8个预期字节根本不显示(原生长) 我怀疑问题在于我设置Java对象的方式,但我个人并没有看到这个问题。 C联盟: union _My_SN { struct { unsigned long sequence; unsigned char variant; unsigned char version; unsigned short pid; } field; struct { unsigned long long ser; unsigned char serName [20]; //16 Characters followed by 4 \0 unsigned […]

C结构到Java JNA结构(指向struct的指针)

我有基于C / C ++结构的JNA结构的问题。 字段nScreenIndex,uVendorID,uProductID,uVersionNumber看起来没问题,但在它们之后我看到奇数字节。 我的主要目标是“提取”pMonitor字段。 pMonitor声明和MONITOR实现是否正确? C / C ++起源: SCREEN* EloGetScreenByIndex (int nScreenIndex); typedef struct SCREEN_TAG { int nScreenIndex; USHORT uVendorID; USHORT uProductID; USHORT uVersionNumber; wchar_t szDevicePath [MAX_PATH]; HANDLE hCalTouchThread; MONITOR* pMonitor; LPVOID pCWndBeamHandler; BOOL bIrBeams; } SCREEN; typedef struct MONITORS_TAG { int elo_mon_num; int x; int y; int width; int height; DWORD […]

从JNA / C调用DLL与Pascal的结果不一致

我有一个提供头文件的c ++ dll库,没有实现。 我为这个库函数实现了JNA调用。 我只有1个function的问题(其他,甚至类似的工作正常)。 这是来自.h文件的声明: int CALLINGCONV SMIMESignML( const char* pin, unsigned long slot, const char* szOutputFilePath, const char* szFrom, const char* szTo, const char* szSubject, const char* szOtherHeaders, const char* szBody, const char* szAttachments, unsigned long dwFlags, int bInitialize ); Java代码: public interface Dll extends StdCallLibrary { public String JNA_LIBRARY_NAME = “libname.dll”; int […]

将JNA指针从一个Java应用程序发送到另一个Java应用程序

我有一个客户端和一个服务器应用程序。 客户端将String命令发送到服务器,该服务器使用JNA对两个DLL库接口进行相关调用。 当然,我会在某些时候需要在java方面使用Pointers。我无法通过套接字连接发送Pointer对象,因为它们不可序列化。 为了解决这个问题,我想我会使用Pointer.nativeValue(p)获取指针的原生长值,在连接上发送该长值并使用它在客户端创建新的指针。 但是,尽管客户端上的Pointer对象与服务器端的Pointer对象具有相同的本机值,但它并未指向客户端上的任何内容,并且出现Invalid Memory Access错误。 现在,在我的客户端应用程序中,我使用JavaFX创建一个窗口,我的DLL可以在其中绘制,因此我必须得到JavaFX窗口的HWND。 然后我做的是将JNA的HWND对象的本机值发送到服务器,然后服务器使用该长本机值重新创建HWND对象。 这样可行。 但很明显,Pointer和其他类似的JNA对象没有。 我认为这些Pointer对象和HWND对象(以及WinDef类中的其他对象)之间的区别在于HWND实际上是一个本机值,因为它来自Windows本身,否则它作为本机就没用了窗把手。 但我认为JNA Pointers仅存在于当前运行的JRE中。 因此,将指针值传递给另一个JRE(我的客户端正在运行)将无法正常工作。 我真的不是100%肯定这一点。 我只是C编程的初学者,所以我对指针知之甚少,更不用说java中的C指针了。 但是如果我对此有正确的想法并且进一步解释,请有人告诉我,特别是关于这些指针如何在java中工作。 这只是我所做的一个例子: // Server side (PointerTest class) public long getPtrVal() { Pointer p = new Memory(100); p.setString(0, “Test”); long ptrVal = Pointer.nativeValue(p); return ptrVal; // return value is processed in separate class } // Client side (MyClient sends […]

有没有什么方法可以释放生成的java代码中的内存来通过JNI / JNA绑定C代码?

我正在使用一个使用JNA绑定到原始C库的Java库(该库名为Leptonica)。 我遇到了一种情况,必须在C代码中调用free(data)来释放内存。 但是,java中是否有任何可以释放内存的function? 在C代码中 void ImageData::SetPixInternal(Pix* pix, GenericVector* image_data) { l_uint8* data; size_t size; pixWriteMem(&data, &size, pix, IFF_PNG); pixDestroy(&pix); image_data->init_to_size(size, 0); memcpy(&(*image_data)[0], data, size); free(data); } 函数pixWriteMem()将为“数据”创建和分配内存,您需要自由(数据)以便以后释放内存。 在Java代码中,我只能访问pixWriteMem(),而不能访问SetPixInternal(),所以我无法释放“数据”,这会造成内存泄漏。

Java JNA UCHAR和PUCHAR

我希望得到一个Java字符串’ WlanHostedNetworkSetSecondaryKey ‘和’ WlanHostedNetworkSetProperty ‘。 一个人想要一个带有CHAR []的结构中的结构,而第一个需要一个PUCHAR。 我尝试使用String,char [],byte []和Memory ,但是它们会继续产生相同的错误(错误参数或错误的配置文件为第一个)。 任何方式可能用JNA调试更多(可能不是:()?我也无法读取使用的characterencoding,除了它不是ANSI ..任何帮助都会很棒! * DWORD WINAPI WlanHostedNetworkSetSecondaryKey( __in HANDLE hClientHandle, __in DWORD dwKeyLength, __in PUCHAR pucKeyData, __in BOOL bIsPassPhrase, __in BOOL bPersistent, __out_opt PWLAN_HOSTED_NETWORK_REASON pFailReason, __reserved PVOID pvReserved * DWORD WINAPI WlanHostedNetworkSetProperty( __in HANDLE hClientHandle, __in WLAN_HOSTED_NETWORK_OPCODE OpCode, __in DWORD dwDataSize, __in PVOID pvData, __out_opt […]

有没有为Delphi(Win32)DLL创建C头文件的工具?

到目前为止,我只看到了为给定的C头文件创建Delphi代码的工具和一些信息。 但是,在’Delphi first’的情况下,有一个Delphi接口声明和一个生成的DLL,没有C头。 是否有工具可以提取必要的信息并为DLL构建C头文件? 这样的工具可以在跨语言/跨平台项目中提供帮助并节省时间。 例如,使用C头文件,使用jnaerator自动创建Java JNA绑定代码会更容易。 工具链看起来像这样: Delphi源码 – >创建C头 – >转换为Java绑定 – >使用Java中的Delphi DLL

JNI与JNA表现

我们有一个原生的c/asm应用程序利用GPU(OpenCL)通过特定的方法获得大的encrypt/decrypt数据,它只是工作完美,没问题。 项目的一部分(Web和分发)由JEE开发,我们只需要调用本机应用程序/库。 我们尝试使用Process类将其称为分离外部进程。 问题是我们无法控制应用程序(事件,处理程序,线程等)。 我们还尝试将C代码切换为Java代码,但性能已经消失。 除了将本机代码作为进程运行之外,我正在考虑JNA和JNI,但是有一些问题。 问题: 为了更好(更快)的读/写解决方案,是否可以通过JNI和JNA中的直接(非托管)内存[Java( ByteBuffer#allocateDirect() )]交换数据? 是否可以通过本机代码管理和处理进程,并通过Java代码(OpenCL lib)访问GPU(共享)内存? 性能怎么样? JNA比JNI快吗? 我们在Redhat Linux6 x64上有两个AMD W7000集群设备。

使用JNA和Ada的Interface.C包将Ada动态库与Java接口

我必须写一个DLL应该提供一个简单的服务,需要: 在字符串或字节数组中(相当于char *) IN整数表示in char *的大小 IN等效于库中用于写入数据的char *缓冲区 用于写入的可用char *缓冲区的大小 将有效的写入大小输出到out char *缓冲区 使用C视角,签名应如下所示: void myService (char* inBuffer, // as in string int anInteger, // as in param char* outBuffer, // used as out buffer, but initalized by calling code int outBufferSize, // the initaliaed size int usedBufferSize // used as out param, the actually […]

返回并访问jna中结构对象的数组

我有一个结构,在C中包含一些char指针: 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]; } 访问它: str2 s2=CLibrary.INSTANCE.parseid(xmlFile1); for(Pointer p1:s2.testCaseID) { if(p1!=null) { System.out.println(p1.getString(0)); } } 编辑 \\c code struct str3{ char *a; […]