我們通過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();
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