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

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android JNI開發(fā)提高篇
有關JNI的開發(fā)技術,我們繼續(xù)圍繞Android平臺進行,JNI可以支持C或C++,從目前為止我們寫過的JNI代碼均為C實現(xiàn)的,即文件名為.C而C++的和這些有什么不同呢? Android平臺上的JNI一般使用C還是C++編寫呢?
   Android平臺在中間層和大部分的類庫的底層使用了C++的開發(fā)方式,后綴為.cpp,比如Android Framework、OpenCore、Webkit、SQLite等等。使用C++好處就是可以使用很多庫但目前Android不支持STL,我們知道 C表示字符串都是字符數(shù)組,但C++可以使用類似string這樣的類型表示。
  1. 代碼上編寫C和C++有啥區(qū)別
  這里Android123就以將Java的unicode字符串轉為jni中的utf8,然后再返回一個jstring類型為例子,可以看到jni和java之間字符串的轉換方法。
  C的實現(xiàn):
view plaincopy to clipboardprint?
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);  

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++的實現(xiàn):
view plaincopy to clipboardprint?
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);  

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);
}
我們加粗了主要區(qū)別的關鍵字,可以看到C++的代碼更簡練。
2. JNI操作數(shù)組代碼
  JNI中處理數(shù)組通用對象為jobjectArray 當然常規(guī)的類型比如整形為jintArray,布爾型為jbooleanArray,但沒有出現(xiàn)jstringArray這樣的類型,有關字符數(shù)組的處理我們將在下次的 Android JNI開發(fā)進階篇 詳細說明 。處理數(shù)組時我們需要考慮數(shù)組的長度不能為0才能繼續(xù)操作,不然就會有訪問越界等問題,在JNI中提供了通用類型的GetArrayLength函數(shù)。我們從Java傳入一個以整形數(shù)組,在JNI中將每個元素相加為例返回一個整形告訴Java運算的結果。
view plaincopy to clipboardprint?
JNIEXPORT jint JNICALL Java_Android123_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<length; i++)  
  {  
     sum += pointer[i]; //相加每個數(shù)組元素  
  }  
  (*env)->ReleaseIntArrayElements(env, array, pointer, 0); //釋放內存,這個不能忘了  
  return sum;  
 } 
JNIEXPORT jint JNICALL Java_Android123_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<length; i++)
  {
     sum += pointer[i]; //相加每個數(shù)組元素
  }
  (*env)->ReleaseIntArrayElements(env, array, pointer, 0); //釋放內存,這個不能忘了
  return sum;
 }
如何在JNI中構造一個數(shù)組呢?  Android開發(fā)網給大家一個簡單的示例,返回一個整形數(shù)組:
view plaincopy to clipboardprint?
JNIEXPORT jobjectArray JNICALL  
Java_Android123_CwjTest2(JNIEnv *env, jclass clazz)  
{  
 jobjectArray result; //定義返回對象  
    
 jclass intArrayClazz = (*env)->FindClass(env, "[I"); //查找整形數(shù)組  
 if (intArrayClazz == NULL)  
 {  
  return NULL;  
 }  
 result = (*env)->NewObjectArray(env, size, intArrayClazz, NULL); //構造一個新的數(shù)組對象  
 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); //構造10個整形數(shù)組  
  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;  

JNIEXPORT jobjectArray JNICALL
Java_Android123_CwjTest2(JNIEnv *env, jclass clazz)
{
 jobjectArray result; //定義返回對象
 
 jclass intArrayClazz = (*env)->FindClass(env, "[I"); //查找整形數(shù)組
 if (intArrayClazz == NULL)
 {
  return NULL;
 }
 result = (*env)->NewObjectArray(env, size, intArrayClazz, NULL); //構造一個新的數(shù)組對象
 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); //構造10個整形數(shù)組
  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類發(fā)生了FileNotFound
view plaincopy to clipboardprint?
(*env)->ThrowNew(env,(*env)->FindClass("java/io/IOException"),"CWJLog Error, IOException"); 
(*env)->ThrowNew(env,(*env)->FindClass("java/io/IOException"),"CWJLog Error, IOException");
方法2:  使用Throw,自己構造
view plaincopy to clipboardprint?
jclass clazz = (*env)->FindClass(env, "java/io/IOException");  
  jmethodID methodId = (*env)->GetMethodID(env, clazz, "<init>", "()V");  
  jthrowable throwable = (*env)->NewObject(env, clazz, methodId);  
 (*env)->Throw(env, throwable); 
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【轉】Android JNI開發(fā)提高篇
NDK 之 JNI數(shù)據(jù)傳輸
jni的異常處理
Android視頻渲染: YUV轉RGB
JNI官方規(guī)范中文版——基本類型、字符串、數(shù)組
JNI攻略之四――JNI操作數(shù)組
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服