用C如何编写给java使用的动态库

//1:编写[CallC.java],用于生成C头文件,C包含此头文件编写方法

 1 //CallC.java
 2     public class CallC
 3     {
 4         static
 5         {
 6             System.loadLibrary("useC");  //注册库文件名、C生成的库文件在windows下为useC.dll linux下生成为libuseC.so
 7          }
 8         //声明的本地方法,可以写多个
 9         public  staitc native int useC(int flag,String path,String action);
10            
11     }


//2:执行[javac CallC.java] ,生成CallC.class

//3:执行[javah -classpath . CallC] 生成CallC.h ,制定classpath为当前路径

//4:编写[CallC.cpp]  拷贝jin.h和jin_md.h到代码目录 修改CallC.h 里面头文件, 如果系统有这些头文件则不需处理

 1 //CallC.cpp
 2 #include "CallC.h"
 3 
 4 #include <stdio.h>
 5 #include <stdlib.h>
 6 
 7 JNIEXPORT jint JNICALL Java_CallC_useC
 8   (JNIEnv * env , jclass arg, jint jmethods , jstring jname, jstring jparam)
 9 {
10     unsigned char *name = NULL;
11     unsigned char *param = NULL;
12     int methods = jmethods;
13     char cmd_buf[256] = {0};14     int nRet = 0 ;
15     
16     if(jparam)
17     {
18         name =  (unsigned char *)env->GetStringUTFChars( jname, JNI_FALSE );
19     }
20     if(jparam)
21     {
22         param = (unsigned char *)env->GetStringUTFChars( jparam, JNI_FALSE );
23     }
24     
25      printf("name = %s\n",name); 
26    printf("param = %s\n",param); 
27    printf("methods = %d\n" , methods);
28    
29     
30     
31     switch(jmethods)
32     {
33         case 1:
34             {
35                 sprintf(cmd_buf,"%s %s" ,name ,  param);
36                 printf("%s\n" , cmd_buf);
37                 system(cmd_buf);
38                 break;
39             }
40         default :
41             {
42                 nRet = 1;
43                 break;
44             }
45     }
46 
47   
48    
49      // 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。
50   env->ReleaseStringUTFChars( jname, (const char *)name ); 
51   env->ReleaseStringUTFChars( jparam, (const char *)param );
52     return 0;  
53 
54 }

 

//5:执行[g++ -Wl,--kill-at -shared -fPIC -o  useC.dll CallC.cpp] 编译代码,生成useC.dll  

//6:编写[UseC.java]测试代码

1 public class UseC
2 {
3     public static void main(String argv[])
4     {
5           int result = CallC.useC(1 , "dir" , "/a:-d");    
6           System.out.print(result);
7     }
8 }

//7:执行[javac -cp . UseC.java]编译java测试源码  

//8:执行[java -Djava_library.path=. -cp . UseC]运行java程序测试动态库

//参考资料 

windows下安装gcc编译环境  http://tieba.baidu.com/p/2826016538

linux下 java JNI调用C语言动态链接库 - JonnyWei的专  http://blog.csdn.net/xiaojianpitt/article/details/5652223

java.lang.UnsatisfiedLinkError解决方法汇集    http://blog.csdn.net/niuxinlong/article/details/4176612

用C如何编写给java使用的动态库,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。