• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Android JNI開發提高篇

    發表于:2013-06-03來源:Csdn作者:xyz_lmn點擊數: 標簽:Android
    有關JNI的開發技術,我們繼續圍繞Android平臺進行,JNI可以支持C或C++,從目前為止我們寫過的JNI代碼均為C實現的,即文件名為.C而C++的和這些有什么不同呢? Android平臺上的JNI一般使用C還是C++編寫呢?

      有關JNI的開發技術,我們繼續圍繞Android平臺進行,JNI可以支持C或C++,從目前為止我們寫過的JNI代碼均為C實現的,即文件名為.C而C++的和這些有什么不同呢? Android平臺上的JNI一般使用C還是C++編寫呢?

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

      1. 代碼上編寫C和C++有啥區別

      這里Android123就以將Java的unicode字符串轉為jni中的utf8,然后再返回一個jstring類型為例子,可以看到jni和java之間字符串的轉換方法。

      C的實現:

      JNIEXPORT jstring JNICALL Java_Android123_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++的實現:

      JNIEXPORT jstring JNICALL Java_Android123_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);

      }

      我們加粗了主要區別的關鍵字,可以看到C++的代碼更簡練。

      2. JNI操作數組代碼

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

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

      {

      int sum = 0;

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

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

      return 0;

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

      for (int i=0; i

      {

      sum += pointer[i]; //相加每個數組元素

      }

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

      return sum;

      }

      如何在JNI中構造一個數組呢? Android開發網給大家一個簡單的示例,返回一個整形數組:

      JNIEXPORT jobjectArray JNICALL

      Java_Android123_CwjTest2(JNIEnv *env, jclass clazz)

      {

      jobjectArray result; //定義返回對象

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

      if (intArrayClazz == NULL)

      {

      return NULL;

      }

      result = (*env)->NewObjectArray(env, size, intArrayClazz, NULL); //構造一個新的數組對象

      if (result == NULL)

      {

      return NULL;

      }

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

      {

      jint szBuffer[256];

      int j;

      jintArray newIntArray = (*env)->NewIntArray(env, 10); //構造10個整形數組

      if (newIntArray == NULL)

      {

      return NULL;

      }

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

      {

      szBuffer[j] = i + j;

      }

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

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

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

      }

      return result;

      }

      3. JNI中有關異常的處理

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

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

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

      方法2: 使用Throw,自己構造

      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);

    原文轉自:http://blog.csdn.net/xyz_lmn/article/details/7017420

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>