Java/JVM:使用它调用本机C方法';地址和签名

Java/JVM:使用它调用本机C方法';地址和签名,java,llvm,native,Java,Llvm,Native,假设我有一个C函数 int32_t add(int32_t a, int32_t b) { return a + b; } 位于JVM进程内存中的地址long funcAddr。有没有办法从Java代码中调用它 在python中,可以从整数初始化CFUNCTYPE实例。我正在寻找完全相同的功能 我发现了这个,但它似乎没有在JVM中实现 我的用例是使用LLVM生成一个函数,并希望在以后执行它。根据注释中的建议,我使用JNA 5.4.0像这样调用函数 Function f=Function.get

假设我有一个C函数

int32_t add(int32_t a, int32_t b) { return a + b; }
位于JVM进程内存中的地址
long funcAddr
。有没有办法从Java代码中调用它

在python中,可以从整数初始化
CFUNCTYPE
实例。我正在寻找完全相同的功能

我发现了这个,但它似乎没有在JVM中实现


我的用例是使用LLVM生成一个函数,并希望在以后执行它。

根据注释中的建议,我使用JNA 5.4.0像这样调用函数

Function f=Function.getFunction(新指针(funcAddr),0,“utf8”);
long result=f.invoke(long.class,long[]{1,2});
//结果==3

根据评论中的建议,我使用JNA 5.4.0调用如下函数

Function f=Function.getFunction(新指针(funcAddr),0,“utf8”);
long result=f.invoke(long.class,long[]{1,2});
//结果==3

出于好奇:如何让方法位于我的JVM进程内存中的long funcAddr地址?您是否编译了自己的JVM?您链接到的巴拿马方案是古老的。巴拿马的早期访问版本位于(带有指向最新信息的链接)。否则,调用C函数的通常方法是通过JNI,这可能会很麻烦。(JNI的书中曾经有一节是关于如何推广这一点的,现在只存档了,例如at,但不可否认,我从未深入研究过这一节的细节…@GhostCat我正在使用javacpp llvm绑定和
LLVMGetFunctionAddress
@Marco13,可能所有新的Graal内容也开始发挥作用。传统的,标准的,麻烦的方法(如Marco13所说,我也同意)是通过(Java本机接口),另一种方法是使用(Java本机访问),这应该更容易使用。出于好奇:如何让您的方法位于JVM进程内存中的long funcAddr地址?您是否编译了自己的JVM?您链接到的巴拿马方案是古老的。巴拿马的早期访问版本位于(带有指向最新信息的链接)。否则,调用C函数的通常方法是通过JNI,这可能会很麻烦。(JNI的书中曾经有一节是关于如何推广这一点的,现在只存档了,例如at,但不可否认,我从未深入研究过这一节的细节…@GhostCat我正在使用javacpp llvm绑定和
LLVMGetFunctionAddress
@Marco13,可能所有新的Graal内容也开始发挥作用。传统的,标准的,麻烦的方法(正如Marco13所说,我也同意)是通过(Java本机接口),另一种方法是使用(Java本机访问),这应该更容易使用。