Android 使用NDK处理BItmap及如何通过C/C++直接控制View的suface显示,学习笔记及方向(一)

2015-01-27 06:14:51 · 作者: · 浏览: 42

最近的学习真的比较困难,因为学习了SDK开发项目后,做了一些简单的项目后,觉得在UI线程中加载较多图片时,总会出现卡顿的感觉,特别是手指滑动下拉时,这种卡顿更易察觉到,而java的结构化开发能力确实是很强大的,使用java开发确实是一件非常享受的事情,但是java在一些高密度的计算中是没有什么优势的,在享受内存自动回收时也会遇到一些不如意的事。任何语言或事物,总会有优缺点,这是java如此简单易用的一个副作用。所以为了不使java的副作用危害到开发者使用java,java产生了一种非常有吸引力的的技术JNI技术,这种技术可以让Java调用C/C++和其他的语言所写的程序。而这种技术也在android中得以支持--NDK, NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk,使用起来非常方便。

说了一堆的废话,接下来记录下自己最近所学习到的东西,可以说NDK重要的学习资料之一就是android的官方网站提供的资料,包括下载了NDK后,也能看到一些简单的使用了NDK的项目源码,这些源码能让我们知道android官方建议我们如何使用NDK,甚至可以用纯C/C++语言开发应用,但这并不是我感兴趣的,具体原因就不说了。

按照官方的使用方式还是比较简单的,这里写了一个用C语言提取照片灰度图的函数,并在java中调用

先写java代码

public class PhotoProcessingActivity extends Activity{
	
	private Bitmap bmOriginal,bmGray;
	private ImageView iv;
	private Button btGray,btOpen;
	
	static{
		System.loadLibrary("PhotoProcessing");
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.photo_processing_activity);
		
		setup();
	}
	
	public void setup(){
		iv = (ImageView) findViewById(R.id.showPhoto);
		bmOriginal = ImageShare.mBitmap;
		iv.setImageBitmap(bmOriginal);
		
		btGray = (Button) findViewById(R.id.btGray);
		btGray.setOnClickListener(onclick);
		btOpen = (Button) findViewById(R.id.btOpen);
		btOpen.setOnClickListener(onclick);
		
	}
	
	OnClickListener onclick = new OnClickListener(){
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			switch(v.getId()){
			case R.id.btGray:
				bmGray = Bitmap.createBitmap(bmOriginal.getWidth(), bmOriginal.getHeight(), Config.ALPHA_8);
				grayPhoto(bmOriginal, bmGray);
				iv.setImageBitmap(bmGray);
				break;
			case R.id.btOpen:
				Intent intent = new Intent(PhotoProcessingActivity.this,
						SurfaceProcessingActivity.class);
				startActivity(intent);
				break;
			}
		}
	};
	
	public native void grayPhoto(Bitmap bmOriginal,Bitmap bmGray);
}
使用javah工具得到头文件PhotoProcessingActivity.h并且添加处理图片所需的一些头文件,这些头文件都是NDK中的include中自带的,使用时可以把把该文件夹链接进去

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
  
   
/* Header for class com_example_photoprocessing_activity_PhotoProcessingActivity */
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #ifndef _Included_com_example_photoprocessing_activity_PhotoProcessingActivity #define _Included_com_example_photoprocessing_activity_PhotoProcessingActivity #ifdef __cplusplus extern "C" { #endif #undef com_example_photoprocessing_activity_PhotoProcessingActivity_MODE_PRIVATE #define com_example_photoprocessing_activity_PhotoProcessingActivity_MODE_PRIVATE 0L #undef com_example_photoprocessing_activity_PhotoProcessingActivity_MODE_WORLD_READABLE #define com_example_photoprocessing_activity_PhotoProcessingActivity_MODE_WORLD_READABLE 1L #undef com_example_photoprocessing_activity_PhotoProcessingActivity_MODE_WORLD_WRITEABLE #define com_example_photoprocessing_activity_PhotoProcessingActivity_MODE_WORLD_WRITEABLE 2L #undef com_example_photoprocessing_activity_PhotoProcessingActivity_MODE_APPEND #define com_example_photoprocessing_activity_PhotoProcessingActivity_MODE_APPEND 3276