下面开始讲第一种方法,纯jni层的代码,该方法基于上面的所有步骤,为静态链接库
声明java层的native方法
使用javah命令生成头文件,内容如下
- 2
- 3
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
使用javah生成头文件的方法如下:
命令行模式,来到main/java目录下,输入java com.lisc.android.opencv.lib.OpenCVHelper后,
在main/java目录下会生成com_lisc_android_opencv_lib_OpenCVHelper.h文件
新建cpp文件,实现对应的方法,就是灰度处理
<span style="font-family:FangSong_GB2312;font-size:12px;">#include "com_lisc_android_opencv_lib_OpenCVHelper.h"
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
using namespace cv;
extern "C" {
JNIEXPORT jintArray JNICALL Java_com_lisc_android_opencv_lib_OpenCVHelper_gray(
JNIEnv *env, jclass obj, jintArray buf, int w, int h);
JNIEXPORT jintArray JNICALL Java_com_lisc_android_opencv_lib_OpenCVHelper_gray(
JNIEnv *env, jclass obj, jintArray buf, int w, int h) {
jint *cbuf;
cbuf = env->GetIntArrayElements(buf, JNI_FALSE );
if (cbuf == NULL) {
return 0;
}
Mat imgData(h, w, CV_8UC4, (unsigned char *) cbuf);
uchar* ptr = imgData.ptr(0);
for(int i = 0; i < w*h; i ++){
//计算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B
//对于一个int四字节,其彩色值存储方式为:BGRA
int grayScale = (int)(ptr[4*i+2]*0.299 + ptr[4*i+1]*0.587 + ptr[4*i+0]*0.114);
ptr[4*i+1] = grayScale;
ptr[4*i+2] = grayScale;
ptr[4*i+0] = grayScale;
}
int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, cbuf);
env->ReleaseIntArrayElements(buf, cbuf, 0);
return result;
}
}</span>
之后,需要将cpp文件编译进去,在Andorid.mk文件中加入
LOCAL_SRC_FILES := com_lisc_android_opencv_lib_OpenCVHelper.cpp
在java层写测试代码,测试一下
Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(R.mipmap.keroro)).getBitmap();
int w = bitmap.getWidth(), h = bitmap.getHeight();
int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
int[] resultPixes = OpenCVHelper.gray(pix, w, h);
Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
result.setPixels(resultPixes, 0, w, 0, 0, w, h);
mIV.setImageBitmap(result);
结果在编译的时候遇到了以下错误
下午1:25:12: Executing external task 'ndkBuild'...
Incremental java compilation is an incubating feature.
:android-opencv-library:ndkBuild
Android NDK: WARNING:/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/jni/Android.mk:OpenCV: non-system libraries in linker flags: -lopencv_java3
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
Android NDK: WARNING:/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/jni/Android.mk:OpenCV: non-system libraries in linker flags: -lopencv_java3
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
make: *** No rule to make target `/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/jni/com_lisc_android_opencv_lib_OpenCVHelper.cpp', needed by `/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/obj/local/armeabi/objs/OpenCV/com_lisc_android_opencv_lib_OpenCVHelper.o'. Stop.
:android-opencv-library:ndkBuild FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':android-opencv-library:ndkBuild'.
> Process 'command '/Users/lisc/Library/Android/sdk/ndk-bundle/ndk-build'' finished with non-zero exit value 2
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 3.501 secs
Process 'command '/Users/lisc/Library/Android/sdk/ndk-bundle/ndk-build'' finished with non-zero exit value 2
下午1:25:16: External task execution finished 'ndkBuild'.
要移动main/jni目录下,和Android.mk保持在同一个目录下,再次编译通过
下午1:42:37: Executing external task 'ndkBuild'...
Incremental java compilation is an incubating feature.
:android-opencv-library:ndkBuild
Android NDK: WARNING:/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/jni/Android.mk:OpenCV: non-system libraries in linker flags: -lopencv_java3
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
Android NDK: WARNING:/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/jni/Android.mk:OpenCV: non-system libraries in linker flags: -lopencv_java3
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
[armeabi] Install : libOpenCV.so => libs/armeabi/libOpenCV.so
[armeabi-v7a] Install : libOpenCV.so => libs/armeabi-v7a/libOpenCV.so
BUILD SUCCESSFUL
Total time: 0.628 secs
下午1:42:38: External task execution finished 'ndkBuild'.
以下是灰度处理后的效果:
以上全部代码可以在此处下载
http://download.csdn.net/detail/ha000/9561823