我新手和我正在testingJNA jar库完全jna-4.1.0.jar和jna-4.1.0.jar jna-platform-4.1.0.jar 。
我正在使用Kernel32,User32,WinBase,WinDef,WinN和WinUser DLL来testing性能。
但是,现在我不想使用JNA (我知道更好,更容易),我想用JNI (是如此困难),而不是(也许我反对stream)!
我想摆脱对外部jar Java文件的依赖
从Linux使用Windows DLL
将exe指向可执行文件目录之外的dll
如何使用SetwindowsHookEx和WH_KEYBOARD钩住外部进程
为什么框架可以使用__ImageBase或GetModuleHandleEx()来检索自己的HMODULE?
loadLibrary失败,GetLastError()== 0的当前path
问题 :什么对象可以用纯Java对象代替JNA对象?
import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Structure; import com.sun.jna.Pointer; import com.sun.jna.Union; import com.sun.jna.NativeLong; import com.sun.jna.ptr.IntByReference;
问题 :我有一个使用JNA进行testing的代码但是我需要知道如何使用纯Java来翻译此结构?
示例SYstem_INFO结构
public static class SYstem_INFO extends Structure { public static class ByReference extends SYstem_INFO implements Structure.ByReference { } public static class UNION extends Union { public static class ByReference extends UNION implements Structure.ByReference { } public static class IntStruct extends Structure { public static class ByValue extends IntStruct implements Structure.ByValue {} public short wProcessorArchitecture; public short wReserved; } public int dwoemId; public IntStruct s; } int dwPageSize; Pointer lpMinimumApplicationAddress; Pointer lpMaximumApplicationAddress; NativeLong dwActiveProcessorMask; int dwNumberOfProcessors; int dwProcessorType; int dwAllocationGranularity; short wProcessorLevel; short wProcessorRevision; }
其他结构OsveRSIONINFOEX结构
typedef struct _OsveRSIONINFOEX { DWORD dwOsversionInfoSize; DWORD dwMajorVersion; DWORD dwMinorVersion; DWORD dwBuildNumber; DWORD dwPlatformId; TCHAR szCSDVersion[128]; WORD wServicePackMajor; WORD wServicePackMinor; WORD wSuiteMask; BYTE wProductType; BYTE wReserved; } OsveRSIONINFOEX,*POsveRSIONINFOEX,*LPOsveRSIONINFOEX;
也许这是一个简单的部分:
public interface Advapi32 extends Library { Advapi32 INSTANCE = (Advapi32)Native.loadLibrary("advapi32",Advapi32.class); boolean GetUserNameA(byte[] name,IntByReference intRef); }
PD我需要一个真正的教程如何使用JNI调用DLL函数(不是世界),使用指针和数据结构等,等等…
对不起,如果我输了…谢谢!
在同一进程中加载多个dll副本
如何使64位DLL与64位版本的Windows Server 2008,Windows 7和Windows XP兼容?
1)采取所有使用基于JNA的Library接口的代码,并用C重写,编译成DLL。
2)在JNI中创建一个API,以允许Java与新的C代码交谈(可能比您正在使用的完整的win32 API稍小)
3)编写代码将本地结构翻译成Java对象或原语。
尽管你可以考虑SWIG,它可能为你生成代码,但是没有从本地结构到Java对象的“魔术”翻译。 这里也有一个例子。
编辑
如果你想真正学习JNI,那么从一些简单的功能开始,然后转向更复杂的功能,一次一个。 JNA的单元测试可以为您提供一些您可能在Java和本机之间传递的数据范围的指示。 它自己的本地库jnidispatch涵盖了几乎所有可能以常规方式进行的交互。
函数返回类型
函数参数
复杂的数据映射( struct / Structure )
函数指针( Callback ) – Callback到Java的本地代码
诚然,JNA需要动态地自动找出如何将Java位转换为本地位,这可以避免手动编写JNI代码,因为无论您编写什么C代码,都可以明确指出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。