【发布时间】:2021-03-02 14:57:21
【问题描述】:
我已经使用 JNA 成功地包装了一个 C DLL 库。 由于我不是 C 开发部分的所有者,我想隐藏 我在 java 端包装的 C 函数的一些参数。
更准确地说,我的 java 代码如下:
public interface IJNALibrary extends Library {
// INIT FUNCTION
public int initFunction(int firstValue, int secondValue, int thirdValue);
}
在 C 端我在 *.h 文件中:
extern "C" CSAMPLE_API int initFunction (
unsigned firstValue,
unsigned secondValue,
unsigned thirdValue);
我的目的是直接将 secondValue 和 thirdValue 参数设置为 1,从而将这些参数隐藏给 java API 用户。 我不希望用户知道他可以更改这些参数的值。 事实上,我想要类似的东西:
public interface IJNALibrary extends Library {
// INIT FUNCTION
public int initFunction(int firstValue);
}
并且 initFunction(int firstValue) 从 C DLL 部分调用 initFunction(int firstValue, int secondValue, int thirdValue)。 但这必须在 java Wrapper 内部完成,而不是从调用 java Wrapper 的代码中完成。 恐怕这不可能,是吗? 除非我创建另一个 C DLL(带有公共 int initFunction(int firstValue) 函数)调用第一个 C DLL(嵌入 initFunction(int firstValue, int secondValue, int thirdValue)。但我宁愿在 java 端按顺序执行不必管理 2 个 C DLL。
另请参阅下面的 Sample.java 文件,该文件调用 IJNALibrary 接口中定义的映射方法。
public class Sample {
static IJNALibrary IJNAFunctions;
public static void main(String[] args) throws IOException {
System.setProperty("jna.library.path", "./librayPath");
// LOADING LIBRARY
IJNAFunctions = (IJNALibrary) Native.load("c", IJNALibrary.class);
int firstValue = 1;
int secondValue = 2;
int thirdValue = 3;
int initReturn = IJNAFunctions.initFunction(firstValue, secondValue, thirdValue);
}
}
感谢您的帮助。
【问题讨论】:
-
你能不能把完整版放在一个用户看不到的“内部”包中,并在公共 API 中添加单参数层?如果您使用模块,则可以强制执行强封装。
-
嗨@Daniel Widdis,我知道内部包和java 模块,但我会看看。谢谢
标签: jna