JNA

遇到java调用共享内存的问题,
java似乎没找到调用共享内存的的api
如果是调用“内存”,去看http://haoningabc.iteye.com/blog/1329079
只能用webservce或jni的方式去java调用c了
为了不把性能消耗在在网络传输上,让webservice先滚蛋
用jna吧,c调用共享内存的就不说了,《linux网络编程第二卷》很详细

jni不好用,还是jna简单
如果在windows下
Java代码   收藏代码
  1. import com.sun.jna.Library;  
  2. import com.sun.jna.Native;  
  3. import com.sun.jna.Platform;  
  4. public class HelloWorld {  
  5.     public interface CLibrary extends Library {  
  6.         CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);  
  7.         void printf(String format, Object... args);  
  8.     }  
  9.     public static void main(String[] args) {  
  10.         CLibrary.INSTANCE.printf("in windows\n");  
  11.         for (int i = 0; i < args.length; i++) {  
  12.             CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);  
  13.         }  
  14.     }  
  15. }  

如果在linux下
顺便把c复习一下,准备做一个testadd的动态库,先测一下动态库是否好使,
先写3个文件test.h test.c testadd.c
test.h
Java代码   收藏代码
  1. #include <stdio.h>  
  2. void add();  

test.c
Java代码   收藏代码
  1. #include <stdio.h>  
  2. #include "test.h"  
  3. int main()  
  4. {  
  5.         printf("haha\n");  
  6.         add();  
  7. }  

testadd.c
Java代码   收藏代码
  1. #include <stdio.h>  
  2. #include <unistd.h>  
  3. void add()  
  4. {  
  5.         char name[65];  
  6.         printf("this is add \n");  
  7.         gethostname(name, sizeof(name));  
  8.         printf("hostname=%s\n",name);  
  9.         system("ls");  
  10. }  


生成libtestadd.so
测试一下是否好使
Java代码   收藏代码
  1. [root@redhat5 c]# gcc -fpic -shared -o libtestadd.so testadd.c  
  2. [root@redhat5 c]# gcc -o test test.c -I. -L. -ltestadd  
  3. [root@redhat5 c]# ./test   
  4. (有写系统可能会报错,比如fedora16,如果报./test: error while loading shared libraries: libtestadd.so: cannot open shared object file: No such file or directory,需要设置一下 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:当前跑程序的目录就可以了)  
  5. haha  
  6. this is add   
  7. hostname=122226  
  8. a.out     libtestadd.so  TestAddService.class          test.h  
  9. biji.txt  main.c         TestAddService.java           y.tab.c  
  10. JNA.chm   test           TestAddService$TestAdd.class  
  11. jna.jar   testadd.c      test.c  
  12. [root@redhat5 c]#   

yeh,"this is add"是libtestadd.so打印的,
现在用jna调用libtestadd.so
把jna.jar放到这个目录下
编写TestAddService.java
Java代码   收藏代码
  1. import com.sun.jna.Library;  
  2. import com.sun.jna.Native;  
  3. public class TestAddService {  
  4.     public TestAddService() {  
  5.     }  
  6.     public interface TestAdd extends Library {  
  7.         TestAdd INSTANCE = (TestAdd) Native.loadLibrary("testadd",TestAdd.class);  
  8.         public void add();  
  9.     }  
  10.     public static void main(String[] args) {  
  11.         TestAdd.INSTANCE.add();  
  12.         System.out.println("哦 yeh yeh jna in linux");  
  13.     }  
  14. }  

Java代码   收藏代码
  1. [root@redhat5 c]# javac -cp .:jna.jar TestAddService.java   
  2. [root@redhat5 c]# java -cp .:jna.jar TestAddService         
  3. this is add   
  4. hostname=122226  
  5. a.out     libtestadd.so  TestAddService.class          test.h  
  6. biji.txt  main.c         TestAddService.java           y.tab.c  
  7. JNA.chm   test           TestAddService$TestAdd.class  
  8. jna.jar   testadd.c      test.c  
  9. 哦 yeh yeh jna in linux  

完了,java定义一个c接口就完了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值