我有一个库,我正在编译并创建一个完全独立的C ++程序。有两个cpp文件,一个具有main,另一个具有所有功能。
目前,该程序是使用带有args的Java ProcessBuilder实现的,用于调用C ++程序,而C ++程序的结果只是简单地转到文件中。
现在,我想要获得那个可以恢复到我的java程序的C ++函数的结果。 (C ++函数中的结果是双无符号字符数组)
所以我的问题是 - 有没有办法映射那些现有的库函数,以便我可以直接从我的java程序中调用它们,并且仍然继续以我当前的独立方式使用该库,这是通过那个驱动程序C ++程序main()?
我基本上试图避免两次编译同一个库 - 一次用于JNI功能,一次用作独立的C ++程序
由于
答案 0 :(得分:0)
我认为exe可以导出类似于dll的函数(在windows上使用__declspec(dllexport)),这意味着你可以像jni-dll一样加载它。 (您可能需要重命名.dll或.so以使java加载它。)
答案 1 :(得分:0)
如果加载不起作用,另一种方法是像现在一样在一个单独的进程中启动程序,但给它一个命令行选项,它与Java程序建立某种共享内存区域。
这样可以避免来回复制daya,但可能需要exe和java程序加载的小实用程序DLL,即不简单。 (不确定Java是否可以轻松设置共享内存而无需本机c调用..)
(将答案分开以进行投票/评论/接受粒度)
答案 2 :(得分:0)
创建一个运行可执行文件并返回字符的JNI包装器DLL。或者,将相关代码编译到静态库中,并将其链接到独立程序的main()函数或从Java调用的JNI存根。进程总是更好。
答案 3 :(得分:0)
Java Native Access (JNA)会做你想要的。
Java Native Interface (JNI)需要在Java和C ++之间增加一层C胶。但是 JNA 可以直接从Java访问某些C函数。
您可能需要声明您的函数extern“C”。您不必重新编译库,但必须将其与C ++主函数链接。
如果你有一个大的C ++类库要公开,那么你可能会对SWIG感兴趣。但对于单个C函数,JNA可能就足够了。
答案 4 :(得分:0)
我相信一个正确的方法是首先将你的函数编译成一个独立的动态库(.dll / .so / .dylib)。 然后你可以: