//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