如何从Java调用c函数。 似乎c是基于编译器的。
我想从Java中调用Windows中的C函数 GCC的功能也是Java。
任何参考?
答案 0 :(得分:68)
答案 1 :(得分:11)
简单来说,只需确保加载包含函数定义的相关库,加载遵循JNI规范的库并从第一个库中包装目标函数,从Java类中公开本机方法,你应该是很高兴。
我建议不要使用原始JNI,因为它包含很多样板代码,如果你开始包装 big C库,你最终会诅咒自己。无论如何,在开始时都可以随意使用JNI,但在实际工作中使用类似JNA的内容。
答案 2 :(得分:5)
您的选项包括:
Java Native Interface
见:https://en.wikipedia.org/wiki/Java_Native_Interface
报价:
JNI使程序员能够编写本机方法来处理当应用程序无法完全用Java编程语言编写时的情况,例如:当标准Java类库不支持特定于平台的功能或程序库
时
Java Native Access
请参阅:https://en.wikipedia.org/wiki/Java_Native_Access
报价:
Java Native Access是一个社区开发的库,它为Java程序提供了对本机共享库的轻松访问,而无需使用Java Native Interface。
<强> JNR-FFI 强>
请参阅:https://github.com/jnr/jnr-ffi
报价:
jnr-ffi是一个java库,用于加载本机库,无需手动编写JNI代码,也不使用SWIG等工具。
答案 3 :(得分:2)
在“特殊”类别中,请参阅NestedVM,它将C编译为Mips,并运行Mips JVM中的VM。
答案 4 :(得分:1)
Checkout JNAerator。 https://code.google.com/p/jnaerator/
您需要提供源代码和预处理器定义等。
答案 5 :(得分:1)
如果您使用的是Windows和MinGW gcc,如果您在lib中获取特定方法的UnsatisfiedLinkError,则可能需要额外的标记:
gcc -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -I"%JAVA_HOME%"\include -I"%JAVA_HOME%"\include\win32 BestCode.c -shared -o BestCode.dll
答案 6 :(得分:0)
答案 7 :(得分:0)
用于制作64位兼容的dll从下面的语句中删除“-MD”选项
“cl -Ic:\ java \ include -Ic:\ java \ include \ win32 -MD -LD HelloWorld.c -FeHelloWorld.dll”
答案 8 :(得分:0)
我找到了解决这个问题的方法。您需要确保的是使用64位c ++编译器编译代码以调用在64位JRE上运行的java函数。与此同时,我们需要将创建的dll文件的路径保存在&#34; Path&#34;在&#34;环境变量&#34;。
答案 9 :(得分:0)
首先通过在属性java.library.path
设置路径,确保在类路径中加载本机库或.dll文件
然后使用System.loadLibrary()
Do not use .dll extension at the end.
答案 10 :(得分:0)
@Jonas给出了一个非常详尽的答案,但我认为它也确实值得检查该网站,您将在那里获得所有基本答案:
http://www.ntu.edu.sg/home/ehchua/programming/java/javanativeinterface.html
它说明了如何使用JNI调用程序: