- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
JNA 和 DLL 对我来说是全新的领域...我有一个自定义 DLL,它的函数声明如下:
int myfunc (const char*);
dll 在 MinGW 下使用以下命令可以正常编译:
>gcc -shared -omydll.dll mydll.c -lgdi32
但是,使用 JNA 加载它会失败,因为它无法在 DLL 中找到该函数。
public interface mydll extends StdCallLibrary {
mydll INSTANCE = (mydll)Native.loadLibrary("mydll", mydll.class);
int myfunc (String arg);
}
我做了一些研究,似乎这个特定的错误与 DLL 函数的调用过程有关。我看过 __stdcall
和 __cdecl
过程。我还看到许多 DLL 函数将 __declspec(dllexport)
放在它们的函数声明/实现之前(我不知道这意味着什么或它做了什么)。所以,由于 JNA 似乎更喜欢 __stdcall
过程,现在我的函数看起来像这样:
__declspec(dllexport) int __stdcall myfunc (const char*);
这看起来 super 复杂,但并不比我尝试过的任何其他方法更好。使用 HashMap 添加下划线前缀和 @4 后缀也不起作用:
mydll INSTANCE = (mydll)Native.loadLibrary("mydll", mydll.class, new HashMap () {{
add("myfunc", "_myfunc@4");
}});
JNA 文档完全没有帮助。老实说,我不知道自己在做什么了。
最佳答案
事实证明,我正在构建我的 DLL,而且 JNA 也发现我的 DLL 也很好;我在确定编译器如何破坏我的符号时犯了一个错误。我命名为 myfunc
的函数被导出为 myfunc@8
或 myfunc@32
取决于他们将多少字节作为参数。这是我在 JNA 项目中使用的代码:
import java.util.*;
import com.sun.jna.*;
import com.sun.jna.win32.*;
//
public class Test
{
public interface mydll extends StdCallLibrary
{
mydll INSTANCE = Native.loadLibrary("mydll", mydll.class, new HashMap {{
put("myfunc", "myfunc@8");
//Other functions
}});
public int myfunc (long arg);
//Other functions
}
//
public static void main (String[] args)
{
System.out.println
(mydll.INSTANCE.myfunc((long)0x23A3920F)); //Or whatever
return 0;
}
}
我的 C 代码:
#include <windows.h>
#include <stdio.h>
__declspec(dllexport) int __stdcall myfunc (__int64);
/* Other functions */
__declspec(dllexport) int __stdcall myfunc (__int64 arg)
{
/* Whatever */
return return_value;
}
GCC 对 -shared
很满意切换并链接到正确的库,就像我原来的问题一样。 我强烈推荐下载this tool这样您就可以准确地找到您的函数名称。
关于java - JNA 找不到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10292338/
我正在使用 JNA 加载 native 库: MyLibrary INSTANCE = (MyLibrary) Native.loadLibrary("mylibrary.so", MyLibrary
任何人都可以为我提供一个 JNA 鼠标钩子(Hook)的工作示例,它能够在我的 Java Swing 应用程序之外跟踪鼠标移动/单击吗? 提前致谢 最佳答案 是的,这里是代码... public cl
我在哪里可以获得支持 ARM64 的 JNA 库? com.sun.jna_4.jar 包含适用于 ARM 的 native libjnidispatch.so 库,但不包含适用于 ARM64 的库。
我正在尝试使用 JNA,因为我想使用一个用 c++ 编写的 .dll,而我的其余代码是用 Java 编写的。但是,如果我尝试导入 JNA 类 Eclipse 声称“com.sun.jna.Librar
我使用以下代码从java程序控制Windows服务 public class PostgresService2 { public static void main(String[] args)
我有一个用于 C 函数 mpv_set_option_string 的 JNA Java 接口(interface),定义为: public interface MPV extends StdCall
我正在查看中央 Maven 存储库,并看到一个 net.java.dev.jna 和一个用于 JNA 的 com.sun.jna groupId。 JNA 的 github,使用 com.sun.jn
我已经开始构建一个 java 服务,它结合了 JNA 来加载 native C/C++ 库,我想在 Raspberry PI aka arm 平台上运行 java 服务。我已经成功地建立了一个稳定的服
我要离开 this如何传递 com.sun.jna.Structure 的示例包含 com.sun.jna.StringArray使用 JNA 从 Java 转换为 native C 代码,并且无法在
我正在准备 spring-boot 应用程序。然后我得到以下错误: JNA not found. native methods will be disabled. java.lang.ClassNot
遇到令人抓狂的阻塞错误: Exception in thread "main" java.lang.Error: Structure.getFieldOrder() on class com.luke
我已经下载并复制 Jna.jar 和 Platform.jar 到/usr/cassandra/apache-cassandra-1.0.7/lib 文件夹,但在 Cassandra 启动时仍然看到以
我有一个像这样的 JNA 库 stub : public interface FREngine extends Library { NativeLibrary JNA_NATIVE_LIB =
我想使用 JNAerator 为 JNA 生成一些 C++ API 函数的 Java 包装器。问题是我无法在工作时使用 JNAerator Studio 或从我的 PC 访问 Github。我只有 G
在 JNA 中,如何从 Xlib 映射联合结构,如以下 XEvent typedef union _XEvent { int type; /* must not be changed *
我正在尝试使用 JNA 从 java 运行 ShellExecute 函数。我在非 unicode 文件夹上运行 ShellExecuteA 没有任何问题 import com.sun.jna.*;
在弄清楚如何将 ClientToScreen winapi 函数与 JNA 结合使用时遇到问题。 我仍然得到窗口句柄坐标的 0, 0 输出。我引用了这个,但我确信我做得不对 https://msdn.
我有两个局部变量: Pointer output; int output_len; /* or better `size_t output_len;` */ 我需要将这些变量的指针传递到 JNA 函数
我有一个openvr binding有一段时间以来有一个小问题 基本上,每当我释放某些几何 3D 模型(基站或 Controller )的内存时,我都会时不时地收到错误: "java.lang.Err
我是 JNA 新手,我想将 DsGetDcName 方法转换为 JNA。 DWORD DsGetDcName( __in LPCTSTR ComputerName, __in LPCT
我是一名优秀的程序员,十分优秀!