久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

[轉(zhuǎn)]android的jni使用方法的一些探索和研究

 linux_android 2015-02-04
基礎樣例

         這部分才是重點?。《嗝辞蓄}。直接先看下運行的東西咯^^

create.png

         是不是更有看的動力了,?還是你拉到下邊直接下載去了==。(沒被鄙視簡單吧T^T)

1)C部分
1.1)TestJni.h
  1. /*  
  2.  * TestJni.h  
  3.  *  
  4.  *  Created on: 2011-12-20  
  5.  *      Author: Join  
  6.  */  
  7.  
  8. #ifndef TESTJNI_H_  
  9. #define TESTJNI_H_  
  10.  
  11. #include <jni.h>  
  12. #include <stdio.h>  
  13. #include <stdlib.h>  
  14. #include <android/log.h>  
  15. #include <android/bitmap.h>  
  16.  
  17. // 測試回調(diào)Java  
  18. #include "CallJava.h"  
  19.  
  20. #define LOG_TAG "JNI_DEBUG"  
  21. #define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)  
  22. #define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)  
  23.  
  24. // JNI調(diào)用函數(shù)必須要用C編譯器編譯  
  25. // C++不加extern "C",,調(diào)用會有異常  
  26. #ifdef __cplusplus  
  27. extern   "C"  { 
  28. #endif  
  29.  
  30. /*  
  31.  * 說明:  
  32.  * 1,、JNIEXPORT、JNICALL:jni的宏,,在android的jni中不必須  
  33.  * 2,、jstring:返回值類型(對應java的jni基本類型)  
  34.  * 3、C方法名:Java_pacakege_class_method  
  35.  * 4,、JNIEnv*,、jobject:jni必要參數(shù)(分別表示jni環(huán)境、java對象)  
  36.  */  
  37. // 樣例1:獲取字符串  
  38. JNIEXPORT jstring JNICALL Java_org_join_ndk_jni_TestJni_getStr(JNIEnv*, 
  39.         jobject); 
  40. // 樣例2:C回調(diào)Java靜態(tài)及非靜態(tài)方法  
  41. JNIEXPORT jstring JNICALL Java_org_join_ndk_jni_TestJni_callJava(JNIEnv*, 
  42.         jobject,  int ,  int ,  int ,  int ); 
  43. // 樣例3:灰度化圖像(Bitmap作為參數(shù))(注:android-8才提供Bitmap.h)  
  44. JNIEXPORT  void  JNICALL Java_org_join_ndk_jni_TestJni_convertToGray(JNIEnv*, 
  45.         jobject, jobject); 
  46.  
  47. // 樣例4:缺少JNIEXPORT,、JNICALL測試  
  48. jintArray Java_org_join_ndk_jni_TestJni_getIntArray(JNIEnv*, jobject); 
  49.  
  50. // 樣例5:C方法不按規(guī)則命名嘗試  
  51. jint getInt(JNIEnv*, jobject); 
  52.  
  53. #ifdef __cplusplus  
  54. #endif  
  55.  
  56. // C++調(diào)用C  
  57. //extern "C" {  
  58. //#include "ImageUtil.h"  
  59. //}  
  60.  
  61. //標準頭文件為何有如下結(jié)構(gòu),?  
  62. //#ifdef __cplusplus  
  63. //extern "C" {  
  64. //#endif  
  65. //...  
  66. //#ifdef __cplusplus  
  67. //}  
  68. //#endif  
  69.  
  70. #endif /* TESTJNI_H_ */  

1.2)TestJni.cpp

  1. /*  
  2.  * TestJni.cpp  
  3.  *  
  4.  *  Created on: 2011-12-20  
  5.  *      Author: Join  
  6.  */  
  7.  
  8. #include "TestJni.h"  
  9.  
  10. // 樣例1:獲取字符串  
  11. JNIEXPORT jstring JNICALL Java_org_join_ndk_jni_TestJni_getStr(JNIEnv *env, 
  12.         jobject obj) { 
  13.      return  env->NewStringUTF( "I'm from C!" ); 
  14.  
  15. int  min( int  x,  int  y) { 
  16.      return  (x <= y) ? x : y; 
  17.  
  18. // 樣例2:C回調(diào)Java靜態(tài)及非靜態(tài)方法  
  19. JNIEXPORT jstring JNICALL Java_org_join_ndk_jni_TestJni_callJava(JNIEnv *env, 
  20.         jobject obj,  int  add_x,  int  add_y,  int  sub_x,  int  sub_y) { 
  21.      char  str[128];  // 字符數(shù)組  
  22.      int  result_add = add(env, add_x, add_y);  // 回調(diào)Java靜態(tài)方法求和  
  23.     LOGE( "==[%d+%d=%d]==" , add_x, add_y, result_add); 
  24.      int  result_sub = sub(env, sub_x, sub_y);  // 回調(diào)Java非靜態(tài)方法求差  
  25.     LOGE( "==[%d-%d=%d]==" , sub_x, sub_y, result_sub); 
  26.      // 將比較得的整數(shù)轉(zhuǎn)成字符串  
  27.     sprintf(str,  "Hello, I'm Join! min=%d" , min(result_add, result_sub)); 
  28.      return  env->NewStringUTF(str); 
  29.  
  30. typedef   struct  { 
  31.     uint8_t red; 
  32.     uint8_t green; 
  33.     uint8_t blue; 
  34.     uint8_t alpha; 
  35. } argb; 
  36.  
  37. // 樣例3:灰度化圖像(Bitmap作為參數(shù))(注:android-8才提供Bitmap.h)  
  38. /**  
  39.  * bitmap:ARGB_8888,32位ARGB位圖  
  40.  */  
  41. JNIEXPORT  void  JNICALL Java_org_join_ndk_jni_TestJni_convertToGray(JNIEnv * env, 
  42.         jobject obj, jobject bitmap) { 
  43.     AndroidBitmapInfo info; 
  44.      void * pixels; 
  45.      int  ret; 
  46.  
  47.     LOGI( "convertToGray" ); 
  48.      if  ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) { 
  49.         LOGE( "AndroidBitmap_getInfo() failed ! error=%d" , ret); 
  50.          return ; 
  51.     } 
  52.  
  53.     LOGI( 
  54.              "color image :: width is %d; height is %d; stride is %d; format is %d;flags is %d" , info.width, info.height, info.stride, info.format, info.flags); 
  55.      if  (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { 
  56.         LOGE( "Bitmap format is not RGBA_8888 !" ); 
  57.          return ; 
  58.     } 
  59.  
  60.      if  ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) { 
  61.         LOGE( "AndroidBitmap_lockPixels() failed ! error=%d" , ret); 
  62.     } 
  63.  
  64.      // modify pixels with image processing algorithm  
  65.  
  66.      int  x, y; 
  67.     uint8_t gray; 
  68.      for  (y = 0; y < info.height; y++) { 
  69.         argb * line = (argb *) pixels; 
  70.          for  (x = 0; x < info.width; x++) { 
  71.             gray = 0.3 * line[x].red + 0.59 * line[x].green 
  72.                     + 0.11 * line[x].blue; 
  73.             line[x].red = line[x].green = line[x].blue = gray; 
  74.              // line[x].alpha = 0xff; // 完全不透明  
  75.         } 
  76.  
  77.         pixels = ( char  *) pixels + info.stride; 
  78.     } 
  79.  
  80.     LOGI( "unlocking pixels" ); 
  81.     AndroidBitmap_unlockPixels(env, bitmap); 
  82.  
  83.  
  84. // 樣例4:缺少JNIEXPORT,、JNICALL測試  
  85. jintArray Java_org_join_ndk_jni_TestJni_getIntArray(JNIEnv *env, jobject obj) { 
  86.      int  array[] = { 12, 34 };  // 新建一個int[]  
  87.     jintArray result = env->NewIntArray(2);  // 新建一個jintArray  
  88.     env->SetIntArrayRegion(result, 0, 2, array);  // 將int[]存入result  
  89.      return  result; 
  90.  
  91. // 樣例5:C方法不按規(guī)則命名嘗試  
  92. jint getInt(JNIEnv *env, jobject obj) { 
  93.      return  256; 
1.3)回調(diào)相關

         參照我的 Java JNI簡單實現(xiàn) 一文,,講了些jni注意點的吧?

2)Java部分
2.1)TestJni
  1. public   class  TestJni { 
  2.  
  3.      /** TAG標識 */  
  4.      private   static   final  String TAG =  "TestJni" ; 
  5.  
  6.      /**  
  7.      * 載入動態(tài)庫  
  8.      */  
  9.      static  { 
  10.         System.loadLibrary( "TestJni" ); 
  11.     } 
  12.  
  13.      /** 樣例1:獲取字符串 */  
  14.      public   static   native  String getStr(); 
  15.  
  16.      /** C回調(diào)Java方法(靜態(tài)) */  
  17.      public   static   int  add( int  x,  int  y) { 
  18.         Log.e(TAG,  "==Java靜態(tài)add方法==" ); 
  19.          return  x + y; 
  20.     } 
  21.  
  22.      /** C回調(diào)Java方法(非靜態(tài)) */  
  23.      public   int  sub( int  x,  int  y) { 
  24.         Log.e(TAG,  "==Java非靜態(tài)sub方法==" ); 
  25.          return  x - y; 
  26.     } 
  27.  
  28.      /** 樣例2:C回調(diào)Java靜態(tài)及非靜態(tài)方法 */  
  29.      public   static   native  String callJava( int  add_x,  int  add_y,  int  sub_x, 
  30.              int  sub_y); 
  31.  
  32.       
  33.      public   static   native   void  convertToGray(Bitmap bitmap); 
  34.  
  35.      /** 樣例4:缺少JNIEXPORT,、JNICALL測試 */  
  36.      public   static   native   int [] getIntArray(); 
  37.  
  38.      /** 樣例5:C方法不按規(guī)則命名嘗試 */  
  39.      public   static   native   int  getInt(); 
  40.  

2.2)AndroidNDKActivity

  1. public   class  AndroidNDKActivity  extends  Activity  implements  
  2.         View.OnClickListener { 
  3.  
  4.      /** 標簽 */  
  5.      private  TextView text; 
  6.  
  7.      /** 按鈕 */  
  8.      private  Button btn1, btn2, btn3, btn4, btn5; 
  9.  
  10.      /** 圖像 */  
  11.      private  ImageView imageView; 
  12.  
  13.      @Override  
  14.      public   void  onCreate(Bundle savedInstanceState) { 
  15.          super .onCreate(savedInstanceState); 
  16.         setContentView(R.layout.main); 
  17.  
  18.          /* 初始化話各組件 */  
  19.         text = (TextView) findViewById(R.id.text); 
  20.         btn1 = (Button) findViewById(R.id.btn1); 
  21.         btn1.setOnClickListener( this ); 
  22.         btn2 = (Button) findViewById(R.id.btn2); 
  23.         btn2.setOnClickListener( this ); 
  24.         btn3 = (Button) findViewById(R.id.btn3); 
  25.         btn3.setOnClickListener( this ); 
  26.         btn4 = (Button) findViewById(R.id.btn4); 
  27.         btn4.setOnClickListener( this ); 
  28.         btn5 = (Button) findViewById(R.id.btn5); 
  29.         btn5.setOnClickListener( this ); 
  30.         imageView = (ImageView) findViewById(R.id.imageView); 
  31.     } 
  32.  
  33.      @Override  
  34.      public   void  onClick(View v) { 
  35.          switch  (v.getId()) { 
  36.          case  R.id.btn1: 
  37.              // 樣例1:獲取字符串  
  38.             text.setText(TestJni.getStr()); 
  39.              break ; 
  40.          case  R.id.btn2: 
  41.              // 樣例2:C回調(diào)Java靜態(tài)及非靜態(tài)方法  
  42.             text.setText(TestJni.callJava( 2 ,  5 ,  8 ,  3 )); 
  43.              break ; 
  44.          case  R.id.btn3: 
  45.              // 獲得Bitmap資源(32位)  
  46.              // BitmapFactory.Options options = new BitmapFactory.Options();  
  47.              // options.inPreferredConfig = Bitmap.Config.ARGB_8888;  
  48.              // Bitmap bitmap = BitmapFactory.decodeResource(getResources(),  
  49.              // R.drawable.ic_launcher, options);  
  50.             Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 
  51.                     R.drawable.ic_launcher); 
  52.              // 樣例3:灰度化圖像(Bitmap作為參數(shù))  
  53.             TestJni.convertToGray(bitmap); 
  54.             imageView.setImageBitmap(bitmap); 
  55.              break ; 
  56.          case  R.id.btn4: 
  57.              // 樣例4:缺少JNIEXPORT,、JNICALL測試  
  58.              int [] array = TestJni.getIntArray(); 
  59.              int  len = array.length; 
  60.             StringBuffer sb =  new  StringBuffer(); 
  61.              for  ( int  i =  0 ; i < len -  1 ; i++) { 
  62.                 sb.append(array[i]); 
  63.                 sb.append( "," ); 
  64.             } 
  65.             sb.append(array[len -  1 ]); 
  66.             text.setText(sb.toString()); 
  67.              break ; 
  68.          case  R.id.btn5: 
  69.              // 樣例5:C方法不按規(guī)則命名嘗試  
  70.              try  { 
  71.                  int  value = TestJni.getInt(); 
  72.                 text.setText(String.valueOf(value)); 
  73.             }  catch  (UnsatisfiedLinkError e) { 
  74.                 text.setText( "UnsatisfiedLinkError!" ); 
  75.                 e.printStackTrace(); 
  76.             } 
  77.              break ; 
  78.         } 
  79.     } 
三、后記

         也是整理的基礎樣例工程,,嘿嘿,!

         注意:

         1)需要2.2系統(tǒng)才可,用了Bitmap.h,。

         2)樣例5(不按命名規(guī)則的那個),,用jni對方法進行注冊,不按要求寫方法名也是可以的,。

         3)灰度化是用的標準公式:Gray = R*0.299 + G*0.587 + B*0.114(考慮效率的話,,有移位公式)

         4)在android-ndk-r6\platforms\android-8\arch-arm\usr\lib目錄下是NDK提供的可調(diào)用庫。(有OpenGL ES^^)
另一個實例,,jni調(diào)用java的方法:

給出兩個點的坐標,,求它們的距離。

首先,,創(chuàng)建一個Point對象,,

Java代碼 

  1. public class Point {    
  2.     float x;    
  3.     float y;    
  4. }    
  5.    
  6.  

然后在c文件中定義一個函數(shù)  

C代碼 

  1. jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b){}   

返回值是float,在jni中定義的是jfloat。

函數(shù)名規(guī)則: Java開頭,,接著是包名的每一段,,然后是類名,最后是Java中調(diào)用的方法名,,中間都用下劃線隔開,。第一個參數(shù)JNIEnv* env和第二個參數(shù)jobject thiz都是必須的,后面的才是Java中傳遞進來的參數(shù),。這里是兩個Point對象,。

首先確定要做的步驟:

◆找到這個Point類

◆找到類中的域x和y的域id

◆根據(jù)ID取出x和y的值

◆計算結(jié)果并返回

那么代碼如下:

Java代碼 

  1. #include  < jni.h >     
  2. #include  < math.h >     
  3. #include  < android /log.h >     
  4.     
  5. jfloat Java_chroya_demo_ndk_Main_distance(JNIEnv* env, jobject thiz, jobject a,jobject b)    
  6. {    
  7.         //步驟1    
  8.     jclass  point_class  = (*env)- > FindClass(env, "chroya/demo/ndk/Point");    
  9.     if( point_class  == NULL) {    
  10.         //printf("class not found");    
  11.         __android_log_write(ANDROID_LOG_INFO, "MyNdkDemo", "class Point not found");    
  12.         return 0;    
  13.     } else {    
  14.         __android_log_write(ANDROID_LOG_INFO, "MyNdkDemo", "found class Point");    
  15.     }    
  16.         //步驟2    
  17.     jfieldID  field_x  = (*env)- > GetFieldID(env, point_class, "x", "F");    
  18.     jfieldID  field_y  = (*env)- > GetFieldID(env, point_class, "y", "F");    
  19.         //步驟3    
  20.     jfloat  ax  = (*env)- > GetFloatField(env, a, field_x);    
  21.     jfloat  ay  = (*env)- > GetFloatField(env, a, field_y);    
  22.     jfloat  bx  = (*env)- > GetFloatField(env, b, field_x);    
  23.     jfloat  by  = (*env)- > GetFloatField(env, b, field_y);    
  24.         //步驟4    
  25.     return sqrtf(powf(bx-ax, 2) + powf(by-ay, 2));    
  26. }   
  27.  

然后在Java里面調(diào)用:

Java代碼 

  1. public class Main extends Activity {    
  2.        
  3.     @Override    
  4.     public void onCreate(Bundle savedInstanceState) {    
  5.         super.onCreate(savedInstanceState);    
  6.         TextView  tv  =  new  TextView(getApplicationContext());    
  7.         Point  a  =  new  Point();    
  8.          a.x  =  3 ;    
  9.          a.y  =  3 ;    
  10.             
  11.         Point  b  =  new  Point();    
  12.          b.x  =  5 ;    
  13.          b.y  =  5 ;    
  14.             
  15.         float  d  =  distance (a,b);    
  16.         tv.setText("distance(a,b):"+d);    
  17.         setContentView(tv);    
  18.     }    
  19.         
  20.     public native float distance(Point a, Point b);    
  21.         
  22.     static {    
  23.         System.loadLibrary("demo");    
  24.     }    
  25. }    
  26.  

轉(zhuǎn)自:
http://vaero.blog.51cto.com/4350852/782787
http://mobile.51cto.com/android-218239.htm

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多