swig 是1个可以将C/C++包装成其它语言(比如:C#, java , python)接口的工具,直接下载即可使用。
下面演示如何用它来调用C代码
一、写一个C示例 example.c- /* File : example.c */
- /* 一个全局变量 */
- double Foo = 3.0;
- /* 计算正整数的最大公约数 */
- int gcd(int x, int y) {
- int g;
- g = y;
- while (x > 0) {
- g = x;
- x = y % x;
- y = g;
- }
- return g;
- }
复制代码
二、编写C的接口类 example.i- /* File : example.i */
- %module example
- /* %{ %} 内的代码会原样拷贝到生成的C包装文件中 */
- %{
- /* 包含C头文件或声明需要包装的函数 */
- extern int gcd(int x, int y);
- extern double Foo;
- %}
- /* 解析以下内容以生成Java接口 */
- extern int gcd(int x, int y);
- extern double Foo;
复制代码
三、生成&编译
3.1 终端里输入:执行成功后,你会看到目录下新生成了三个文件:
- example_wrap.c:JNI包装代码。
- example.java:Java层的模块类,提供了静态方法供我们调用。
- exampleJNI.java:Java层的JNI接口类,定义了与C代码的底层映射。
3.2 生成.so(linux/unix平台)或.dll(windows平台)
以windows为例(使用MinGW):- gcc -shared example.c example_wrap.c \
- -I "C:/Program Files/Java/jdk1.8.0/include" \
- -I "C:/Program Files/Java/jdk1.8.0/include/win32" \
- -o example.dll
复制代码 会生成example.dll文件
四、在java中调用 - // File: main.java
- public class main {
- static {
- // 加载我们刚刚编译生成的动态链接库
- // Linux/macOS下加载 "example" (对应libexample.so)
- // Windows下加载 "example" (对应example.dll)
- System.loadLibrary("example");
- }
- public static void main(String[] args) {
- // 调用C函数,就像调用Java静态方法一样
- int x = 42;
- int y = 105;
- int g = example.gcd(x, y);
- System.out.println("The greatest common divisor of " + x + " and " + y + " is " + g);
- // 访问并修改C全局变量
- // SWIG为全局变量自动生成了getter/setter
- System.out.println("Original Foo = " + example.getFoo());
- example.setFoo(3.14159);
- System.out.println("New Foo = " + example.getFoo());
- }
- }
复制代码 编译java源文件到class文件至此,目录下的文件清单如下:
- example.c
- example.class
- example.dll
- example.i
- example.java
- exampleJNI.class
- exampleJNI.java
- example_wrap.c
- main.class
- main.java
运行测试(jdk25环境):- java.exe '-Djava.library.path=./' --enable-native-access=ALL-UNNAMED main
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |