从Java调用c函数

时间:2011-05-11 11:11:29

标签: java c

如何从Java调用c函数。 似乎c是基于编译器的。

我想从Java中调用Windows中的C函数 GCC的功能也是Java。

任何参考?

11 个答案:

答案 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。

http://nestedvm.ibex.org/

答案 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)

JNI - Java Native Interface

要从Java调用C函数,您需要使用JNI

答案 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调用程序:

  • 对于C语言和C ++语言或两者的混合语言
  • 没有任何参数,原语,字符串或原语数组的JNI
  • 访问对象变量,回调实例方法等等。