我正在编写一种运行时系统/解释器,我需要做的一件事就是调用位于外部库中的c/c ++函数.
在linux上我使用这些dlfcn.h函数来打开一个库,并调用一个位于其中的函数.问题是,当使用dlsysm()返回的函数指针需要在被调用之前被转换为适当的类型,以便知道函数参数和返回类型,但是如果我在库中调用一些任意函数那么显然我不会在编译时知道这个原型.
所以我要问的是,有没有办法调用动态加载的函数并传递参数,并在不知道它的原型的情况下检索它的返回值?
到目前为止,我已经得出结论没有简单的方法来做到这一点,但我发现的一些解决方法是:
确保我想要加载的所有函数都具有相同的原型,并为这些函数提供一些排序机制来检索参数和返回值.这就是我目前正在做的事情.
使用内联asm将参数压入堆栈,并读取返回值.如果可能的话,我真的想避免这样做!
如果有人有任何想法,那将非常感激.
编辑:
我现在找到了我正在寻找的东西:
"便携式外部函数接口库"
(虽然我承认我原来的问题可以更清楚!)
我有一个Java应用程序,它从某个地方解析一个数字,并检查它是一个有效的int(在Integer.MIN_VALUE和Integer.MAX_VALUE之间)还是一个有效的double(在Double.MIN_VALUE和Double.MAX_VALUE之间).
我正在使用此代码:
import java.math.BigDecimal;
import java.math.BigInteger;
public class Test {
public static final BigDecimal DOUBLE_MAX = BigDecimal.valueOf(Double.MAX_VALUE);
public static final BigDecimal DOUBLE_MIN = BigDecimal.valueOf(Double.MIN_VALUE);
public static final BigInteger INTEGER_MIN = BigInteger.valueOf(Integer.MIN_VALUE);
public static final BigInteger INTEGER_MAX = BigInteger.valueOf(Integer.MAX_VALUE);
private static boolean inRange(BigDecimal value) {
return DOUBLE_MAX.compareTo(value) >= 0 &&
DOUBLE_MIN.compareTo(value) <= 0;
}
private static boolean inRange(BigInteger value) {
return INTEGER_MAX.compareTo(value) >= 0 &&
INTEGER_MIN.compareTo(value) <= 0;
}
public static void main(String[] args)
{
System.out.println(inRange(new BigInteger("1234656")));
System.out.println(inRange(new BigInteger("0")));
System.out.println(inRange(new BigInteger("-987"))); …Run Code Online (Sandbox Code Playgroud)