前阵子使用JNI希望在Android中掉用C/C++写的函数,函数的功能是对图片进行处理,这里就涉及到图片作为参数传递的问题。因为JNI就只能对那几种基本操作,不能直接将图片作为参数,需要对图片进行处理转换成其他类型而保证其信息没有损耗。最初我使用整型数组传递图片信息,关键代码如下:

JNI接口:

public static native int[] ImgFun(int[] buf, int w, int h);

JNI函数调用(JAVA):

Bitmap img1 = ((BitmapDrawable) getResources().getDrawable(R.drawable.test1)).getBitmap();   int w = img1.getWidth(), h = img1.getHeight();   int[] pix = new int[w * h];   img1.getPixels(pix, 0, w, 0, 0, w, h);   int[] resultInt=ImgActivity.ImgFun(pix, w, h); 

JNI函数实现(C++):

JNIEXPORT jintArray JNICALL Java_xj_example1_opencvjnitest_ImgActivity_ImgFun  (JNIEnv *env, jclass, jintArray buf, jint w, jint h){    jint *cbuf = env->GetIntArrayElements(buf,0);if(cbuf == NULL){return 0;}Mat myimg(h, w, CV_8UC3, (unsigned char*)cbuf);imwrite("/sdcard2/objdetect/test1.jpg", myimg);                //对图像做处理imwrite("/sdcard2/objdetect/test2.jpg", myimg);int size = w * h;jintArray result = env->NewIntArray(size);env->SetIntArrayRegion(result, 0, size, cbuf);env->ReleaseIntArrayElements(buf, cbuf, 0);return result;}
但是这样做对于一些操作会出现问题,比如我传递过去一张图片,传递前图片是这个样子的:


传过去后我再保存一下,然后发现是这个样子的:


而且图片大小也发生了变化。我认为是mat为了实现字节对齐,需要保证每行是4的倍数,从而导致了这种问题(只是个人观点)。所以不建议用这种方式传递图片数据,推荐使用下面这种传递图片地址的方式:

JNI接口:

public static native void detect(long imgaddr);
JNI函数调用(JAVA):

Mat dstMat = Highgui.imread("/sdcard2/objdetect/img/t4.jpg");//call jni to detectDetectionActivity.detect(dstMat.getNativeObjAddr());

JNI函数实现(C++):

JNIEXPORT void JNICALL Java_hisense_xj_objdetect_DetectionActivity_detect  (JNIEnv *env, jclass, jlong imgaddr){Mat *img = (cv::Mat*)imgaddr;}


更多相关文章

  1. Android(安卓)调用系统相机,拍照,并上传图片所注意的一些问题
  2. 【Android】GridView显示大量图片缓存问题(一)
  3. h5页面引用idangerous.swiper.js 插件兼容ios和android出现的问
  4. Android(安卓)WebView的缓存
  5. Android应用程序包解析过程浅析
  6. android HAL层代码
  7. 菜鸟也能解决android中的OOM问题
  8. Android之项目推荐使用的第三方库
  9. Android(安卓)Activity 二

随机推荐

  1. 关于“Only the original thread that cr
  2. Android换肤机制
  3. Android点击事件的四种写法
  4. Android编程: 环境搭建、基本知识
  5. 杂七杂八2
  6. Android去除标题栏及自定义title栏
  7. android资源配置文件
  8. 背景图片显示问题 图片显示错误 android
  9. Cordova 入门AndroidStudio集成
  10. android动画效果处理