国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
【轉(zhuǎn)】Android JNI開發(fā)提高篇
Android JNI開發(fā)提高篇
時(shí)間:2010-11-04 11:19 來源:未知 點(diǎn)擊:98次
AndroidJNI開發(fā)提高篇,有關(guān)JNI的開發(fā)技術(shù),我們繼續(xù)圍繞Android平臺(tái)進(jìn)行,JNI可以支持C或C++,從目前為止我們寫過的JNI代碼均為C實(shí)現(xiàn)的,即文件名為.C而C++的和這些有什么不同呢? Android平臺(tái)上的JNI一般使用C還是C++編寫呢

有關(guān)JNI的開發(fā)技術(shù),我們繼續(xù)圍繞Android平臺(tái)進(jìn)行,JNI可以支持C或C++,從目前為止我們寫過的JNI代碼均為C實(shí)現(xiàn)的,即文件名為.C而C++的和這些有什么不同呢? Android平臺(tái)上的JNI一般使用C還是C++編寫呢?

Android平臺(tái)在中間層和大部分的類庫的底層使用了C++的開發(fā)方式,后綴為.cpp,比如AndroidFramework、OpenCore、Webkit、SQLite等等。使用C++好處就是可以使用很多庫但目前Android不支持STL,我們知道C表示字符串都是字符數(shù)組,但C++可以使用類似string這樣的類型表示。

1. 代碼上編寫C和C++有啥區(qū)別

這里安博中程就以將Java的unicode字符串轉(zhuǎn)為jni中的utf8,然后再返回一個(gè)jstring類型為例子,可以看到j(luò)ni和java之間字符串的轉(zhuǎn)換方法。

C的實(shí)現(xiàn):

JNIEXPORT jstring JNICALL Java__CwjC (JNIEnv *env, jobject obj,jstring string)

{

const char *strUTF = (*env)->GetStringUTFChars(env, string, 0);

char szBuffer[255];

strcpy(szBuffer, strUTF);

(*env)->ReleaseStringUTFChars(env, string, strUTF);

return (*env)->NewStringUTF(env, szBuffer);

}

C++的實(shí)現(xiàn):

JNIEXPORT jstring JNICALL Java__CwjCpp (JNIEnv *env, jobject obj,jstring string)

{

const char *strUTF = env->GetStringUTFChars(string, 0);

char szBuffer[255];

strcpy(szBuffer, strUTF);

env->ReleaseStringUTFChars(string, strUTF);

return env->NewStringUTF(szBuffer);

}

我們加粗了主要區(qū)別的關(guān)鍵字,可以看到C++的代碼更簡練。

2. JNI操作數(shù)組代碼

JNI中處理數(shù)組通用對(duì)象為jobjectArray當(dāng)然常規(guī)的類型比如整形為jintArray,布爾型為jbooleanArray,但沒有出現(xiàn)jstringArray這樣的類型,有關(guān)字符數(shù)組的處理我們將在下次的《Android JNI開發(fā)進(jìn)階篇》詳細(xì)說明。處理數(shù)組時(shí)我們需要考慮數(shù)組的長度不能為0才能繼續(xù)操作,不然就會(huì)有訪問越界等問題,在JNI中提供了通用類型的GetArrayLength函數(shù)。我們從Java傳入一個(gè)以整形數(shù)組,在JNI中將每個(gè)元素相加為例返回一個(gè)整形告訴Java運(yùn)算的結(jié)果。

JNIEXPORT jint JNICALL Java__CwjTest (JNIEnv *env, jobject obj,jintArray array)

{

int sum = 0;

jsize length = (*env)->GetArrayLength(env, array); //獲取數(shù)組長度

if(length==0) //防止異常發(fā)生,如果是空的需要返回了

return 0;

jint *pointer = (*env)->GetIntArrayElements(env, array, 0);//獲取數(shù)組指針

for (int i=0; i

{

sum += pointer[i]; //相加每個(gè)數(shù)組元素

}

(*env)->ReleaseIntArrayElements(env, array, pointer, 0);//釋放內(nèi)存,這個(gè)不能忘了

return sum;

}

如何在JNI中構(gòu)造一個(gè)數(shù)組呢? Android開發(fā)網(wǎng)給大家一個(gè)簡單的示例,返回一個(gè)整形數(shù)組:

JNIEXPORT jobjectArray JNICALL

Java__CwjTest2(JNIEnv *env, jclass clazz)

{

jobjectArray result; //定義返回對(duì)象

jclass intArrayClazz = (*env)->FindClass(env, "[I"); //查找整形數(shù)組

if (intArrayClazz == NULL)

{

return NULL;

}

result = (*env)->NewObjectArray(env, size, intArrayClazz, NULL);//構(gòu)造一個(gè)新的數(shù)組對(duì)象

if (result == NULL)

{

return NULL;

}

for (int i = 0; i < 10 ; i++) //循環(huán)10次

{

jint szBuffer[256];

int j;

jintArray newIntArray = (*env)->NewIntArray(env, 10); //構(gòu)造10個(gè)整形數(shù)組

if (newIntArray == NULL)

{

return NULL;

}

for (j = 0; j < 10 ; j++) //10個(gè)

{

szBuffer[j] = i + j;

}

(*env)->SetIntArrayRegion(env, newIntArray, 0, 10, szBuffer);//設(shè)置長度為10個(gè)

(*env)->SetObjectArrayElement(env, result, i, newIntArray);

(*env)->DeleteLocalRef(env, newIntArray);

}

return result;

}

3. JNI中有關(guān)異常的處理

JNI中拋出異常沒有try...catch這樣的,而是直接拋出錯(cuò)誤

方法1: 使用ThrowNew,比如IOException類發(fā)生了FileNotFound

(*env)->ThrowNew(env,(*env)->FindClass("java/io/IOException"),"CWJLogError, IOException");

方法2: 使用Throw,自己構(gòu)造

jclass clazz = (*env)->FindClass(env, "java/io/IOException");

jmethodID methodId = (*env)->GetMethodID(env, clazz, "","()V");

jthrowable throwable = (*env)->NewObject(env, clazz, methodId);

(*env)->Throw(env, throwable);

有關(guān)JNI的異常,要說的還有很多,我們將在下次詳細(xì)說明這些。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android JNI開發(fā)提高篇
NDK 之 JNI數(shù)據(jù)傳輸
jni的異常處理
Android視頻渲染: YUV轉(zhuǎn)RGB
JNI官方規(guī)范中文版——基本類型、字符串、數(shù)組
JNI攻略之四――JNI操作數(shù)組
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服