我是新手,我正在测试 JNA jar 库 jna-4.1.0.jar
和 jna-platform-4.1.0.jar
。
我使用 Kernel32、User32、WinBase、WinDef、WinN 和 WinUser dll 测试性能。
但是,现在我不想使用 JNA(我知道更好更简单)我想使用 JNI(太难了)(也许我逆流而上)!!!
我想摆脱对外部 jar Java 文件的依赖
问题:什么对象可以用纯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 进行测试的代码,但我需要知道如何使用纯 Java 翻译这个结构?
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;
}
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 函数(不是 Hello world),使用指针和数据结构等等......
对不起,如果我输了... 谢谢!
最佳答案
1) 获取所有使用基于 JNA 的 Library
接口(interface)的代码,并用 C
重写它,将其编译为 DLL。
2) 在 JNI 中制作一个 API 以允许 Java 与您的新 C
代码对话(可能比您正在使用的完整 win32 API 小一些)
3) 编写代码将 native 结构转换为 Java 对象或原语。
没有从 native 结构到 Java 对象的“神奇”转换,尽管您可以考虑 SWIG,它可能会为您生成代码来执行此操作。还有一个例子 here .
编辑
如果您想真正学习 JNI,请从一些简单的函数开始,然后逐步学习更复杂的函数,一次一个。 JNA 的单元测试可以为您提供一些关于您可能在 Java 和 native 之间传递的数据范围的指示。它自己的本地库 jnidispatch
几乎涵盖了您可能以一般方式进行的所有交互。
- 函数返回类型
- 函数参数
- 复杂数据映射(
struct
/Structure
) - 函数指针 (
Callback
) - 回调 Java 的 native 代码
诚然,JNA 有相当一部分与动态和自动确定如何将 Java 位转换为 native 位有关,您可以在手动编写 JNI 代码时避免这种情况,因为您可以显式地显示任何 C
你写的代码。
关于java - 我想通过编写自己的 JNI 代码来学习如何做 JNA 所做的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31552749/