jni java和C之間的值傳遞(int String int[])

我們通過jni調用C代碼不可能每次只是去調一個方法,通常,我們需要傳遞一些值過去。

例如,播放電影,那就肯定需要你把電影的 url給 C的播放器吧,等等。

接下來就看一看怎麼去傳遞這些值:


首先是最簡單的 int類型:

申明變量

	//c實現兩個數相加
	public native int add(int x ,int y);

調用方法

    	//Java把兩個int給c語言,c語言處理完還給java
    	int result = add(10,20);    	
    	Toast.makeText(this, result+ "", 0).show();


C代碼實現

JNIEXPORT jint JNICALL Java_com_test_ndk3_MainActivity_add
  (JNIEnv * env, jobject obj, jint x, jint y){
	return x + y;
}
就是int成了  jint,沒多大區別


下面看String

字符串就要麻煩很多了,JAVA調用方法和上面的一樣,就不重複的寫了,也沒多大的意義

就看下不一樣的地方

//將java字符串 轉換成 c的字符串
char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr)//zhang3.getBytes("gb2312");
{
	 char*   rtn   =   NULL;
	 jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String");
	 jstring   strencode   =   (*env)->NewStringUTF(env,"GB2312");
	 jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,   "getBytes",   "(Ljava/lang/String;)[B");
	 jbyteArray   barr=   (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getBytes("GB2312");
	 jsize   alen   =   (*env)->GetArrayLength(env,barr);
	 jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
	 if(alen   >   0)
	 {
	  rtn   =   (char*)malloc(alen+1);         //"\0"
	  memcpy(rtn,ba,alen);
	  rtn[alen]=0;
	 }
	 (*env)->ReleaseByteArrayElements(env,barr,ba,0);  //
	 return rtn;
}
需要把java的字符串轉成C的字符串

其他地方都差不多

就不贅述了,最後會把學習例子放上來大家參考


接下來是int數組

這裏要注意的一點是 C中的指針概念,如果不明白,多看看

  

  (JNIEnv * env, jobject obj, jintArray jintArr){
	//得到數組元素信息(首元素的位置  ==== 數組的首地址)  +10  得到數組的長度
	//jsize       (*GetArrayLength)(JNIEnv*, jarray);
	//得到指定數組的元素的個數
	jint len = (**env).GetArrayLength(env, jintArr);
	//jint*       (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
	//得到指定數組中的元素信息
	//jboolean*  JNI_TRUE 1 複製        JNI_FLASE 0  引用(不復制)
	//返回值:  得到數組元素後 數組的起始位置
	jint* arr = (**env).GetIntArrayElements(env, jintArr, 0);


資源下載地址   :http://download.csdn.net/detail/brightshadow11111/5947267







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章