找回密码
 立即注册
首页 业界区 安全 利用SWIG实现JAVA调用C/C++代码

利用SWIG实现JAVA调用C/C++代码

沦嘻亟 2 小时前
swig 是1个可以将C/C++包装成其它语言(比如:C#, java , python)接口的工具,直接下载即可使用。
下面演示如何用它来调用C代码
 
一、写一个C示例 example.c
  1. /* File : example.c */
  2. /* 一个全局变量 */
  3. double Foo = 3.0;
  4. /* 计算正整数的最大公约数 */
  5. int gcd(int x, int y) {
  6.   int g;
  7.   g = y;
  8.   while (x > 0) {
  9.     g = x;
  10.     x = y % x;
  11.     y = g;
  12.   }
  13.   return g;
  14. }
复制代码
  
二、编写C的接口类 example.i
  1. /* File : example.i */
  2. %module example
  3. /* %{ %} 内的代码会原样拷贝到生成的C包装文件中 */
  4. %{
  5. /* 包含C头文件或声明需要包装的函数 */
  6. extern int gcd(int x, int y);
  7. extern double Foo;
  8. %}
  9. /* 解析以下内容以生成Java接口 */
  10. extern int gcd(int x, int y);
  11. extern double Foo;
复制代码
  
三、生成&编译
3.1 终端里输入:
  1. swig -java example.i
复制代码
执行成功后,你会看到目录下新生成了三个文件:

  • example_wrap.c:JNI包装代码。
  • example.java:Java层的模块类,提供了静态方法供我们调用。
  • exampleJNI.java:Java层的JNI接口类,定义了与C代码的底层映射。
 
3.2 生成.so(linux/unix平台)或.dll(windows平台)
以windows为例(使用MinGW):
  1. gcc -shared example.c example_wrap.c \
  2.     -I "C:/Program Files/Java/jdk1.8.0/include" \
  3.     -I "C:/Program Files/Java/jdk1.8.0/include/win32" \
  4.     -o example.dll
复制代码
会生成example.dll文件
 
四、在java中调用 
  1. // File: main.java
  2. public class main {
  3.     static {
  4.         // 加载我们刚刚编译生成的动态链接库
  5.         // Linux/macOS下加载 "example" (对应libexample.so)
  6.         // Windows下加载 "example" (对应example.dll)
  7.         System.loadLibrary("example");
  8.     }
  9.     public static void main(String[] args) {
  10.         // 调用C函数,就像调用Java静态方法一样
  11.         int x = 42;
  12.         int y = 105;
  13.         int g = example.gcd(x, y);
  14.         System.out.println("The greatest common divisor of " + x + " and " + y + " is " + g);
  15.         // 访问并修改C全局变量
  16.         // SWIG为全局变量自动生成了getter/setter
  17.         System.out.println("Original Foo = " + example.getFoo());
  18.         example.setFoo(3.14159);
  19.         System.out.println("New Foo = " + example.getFoo());
  20.     }
  21. }
复制代码
编译java源文件到class文件
  1. javac *.java
复制代码
至此,目录下的文件清单如下:

  • example.c
  • example.class
  • example.dll
  • example.i
  • example.java
  • exampleJNI.class
  • exampleJNI.java
  • example_wrap.c
  • main.class
  • main.java
 
运行测试(jdk25环境):
  1. java.exe '-Djava.library.path=./' --enable-native-access=ALL-UNNAMED main
复制代码
1.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册