首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想学习如何通过编写自己的JNI代码来完成JNA所做的工作。

我想学习如何通过编写自己的JNI代码来完成JNA所做的工作。
EN

Stack Overflow用户
提问于 2015-07-22 02:14:13
回答 1查看 442关注 0票数 3

我和新手正在测试JNA库,确切地说是jna-4.1.0.jarjna-platform-4.1.0.jar

我正在用Kernel32、User32、WinBase、WinDef、WinN和WinUser dll测试性能。

但是,现在我不想使用JNA (我知道它更好也很容易),我想使用JNI (太难了)而不是(也许我会逆流而上)!

我想摆脱对外部jar Java文件的依赖

问题:用纯对象代替JNA对象的对象是什么?

代码语言:javascript
复制
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来转换这个结构?

示例信息结构

代码语言:javascript
复制
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结构

代码语言:javascript
复制
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;

也许这是最简单的部分:

代码语言:javascript
复制
  public interface Advapi32 extends Library {
    Advapi32 INSTANCE = (Advapi32)Native.loadLibrary("advapi32", Advapi32.class);
    boolean GetUserNameA(byte[] name, IntByReference intRef);
  }

PD我需要一个真正的教程,如何使用JNI调用DLL函数(不是Hello ),如何使用指针和数据结构等.

抱歉如果我输了..。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-07-22 12:28:55

1)将使用基于JNA的Library接口的所有代码都用C重写,将其编译成DLL。

2)在JNI中创建一个API,允许Java与您的新C代码对话(可能比您正在使用的完整win32 API要小一些)。

3)编写代码将本机结构转换为Java对象或原语。

不存在从本机结构到Java对象的“神奇”转换,尽管您可以考虑SWIG,这可能会为您生成代码。还有一个例子这里

编辑

如果您想真正学习JNI,那么从一些简单的函数开始,然后转到更复杂的函数,一次一个。JNA的单元测试可以为您提供Java和本机之间可能通过的数据范围的一些指示。它自己的本机库jnidispatch以一般的方式涵盖了几乎所有的交互。

  • 函数返回类型
  • 函数参数
  • 复杂数据映射(struct/Structure)
  • 函数指针(Callback) --调用回Java的本机代码

当然,相当一部分JNA与动态和自动地解决如何将Java位转换为本机位有关,在手动编写JNI代码时可以避免这种情况,因为无论编写什么C代码,都可以显式化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31552749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档