字符串參數傳遞與返回值(轉)


轉載請注明出處!

原文地址鏈接:http://blog.csdn.net/zgyulongfei/article/details/7409441

 

在編程的時候我們不僅需要使用無參的函數,有參數的函數也是必須的。

這次我編寫一個函數用來傳遞String類型參數,並輸出該函數的返回值。

編寫java類:

 

[java]  view plaincopy
  1. class StringFunction  
  2. {  
  3.     private native String getWords(String hint);  
  4.     static  
  5.     {  
  6.         System.loadLibrary("StringFunction");  
  7.     }  
  8.     public static void main(String [] args)  
  9.     {  
  10.         StringFunction sf = new StringFunction();  
  11.         String hint = "say something: ";  
  12.         String words = sf.getWords(hint);  
  13.         System.out.println("Get the words: " + words);  
  14.     }  
  15. }  

 

 

在命令行界面下,輸入命令編譯:javac  StringFunction.java

生成.class之后,繼續輸入命令:javah  –jni  StringFunction

接着就生成了StringFunction.h之后,然后開始編寫c文件StringFunction.c了。

C代碼如下:

 

[cpp]  view plaincopy
  1. #include <jni.h>  
  2. #include "StringFunction.h"  
  3.   
  4. JNIEXPORT jstring JNICALL Java_StringFunction_getWords(JNIEnv *env, jobject obj, jstring hint)  
  5. {  
  6.     char buf[128];    
  7.     const char *str = (*env)->GetStringUTFChars(env, hint, NULL);//注釋1  
  8.     if(str == NULL)  
  9.     {//注釋2  
  10.         return NULL;  
  11.     }  
  12.     printf("%s", str);    
  13.     (*env)->ReleaseStringUTFChars(env, hint, str);//注釋3  
  14.     scanf("%s", buf);     
  15.     return (*env)->NewStringUTF(env, buf);//注釋4  
  16. }  


代碼寫好后,將StringFunction.c 編譯成DLL動態鏈接庫(不懂編譯?看這里)。

 

運行程序,結果如下:

 

 

分析:

注釋1:由於不能將jstring類型直接轉換為c語言的char*類型,所以通過GetStringUTFChars進行操作。GetStringUTFChars方法可以獲得到以UTF-8格式的字符串的指針。

const jchar *GetStringChars(JNIEnv*env, jstring str, jboolean *isCopy);

當isCopy為JNI_TRUE時,表示返回源字符串的一個副本;當其為JNI_FALSE表示直接返回源字符串的指針;通常為NULL,因為我們不關心返回的是一個實例還是一個指向源字符串的指針。

注釋2:由於java虛擬機分配內存空間可能會失敗,所以這里得進行一次判斷。

注釋3:用了GetStringChars得記得調用ReleaseStringUTFChars方法釋放內存,如果不釋放的話,可能導致內存泄露。

注釋4:將UTF-8的字符序列buf轉換成String類型

-------------------------------------------------

要下載本文源碼,請點擊這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM