使用String[],int[]等一维数组传递参数
java native 函数
public native boolean getPlate(Bitmap in,String[] result,int[] rect,float[] featurearray);
jni 函数
JNIEXPORT jboolean
JNICALL
Java_camera_hj_cameracontroller_EasyPR_EasyPR_getPlate
(JNIEnv *env, jobject obj,jobject bmpIn,
jobjectArray result, //String[]
jintArray facerect, //int[]
jfloatArray featurearray //float[]
// 1. 使用String[]
...
jstring recognizeresult_ = env->NewStringUTF(recognizeResult.c_str());
env->SetObjectArrayElement(result, 0, recognizeresult_);
....
// 2. 使用int[]类型传递参数
std::vector<int >rect;
...
env->SetIntArrayRegion(facerect, 0, 4, &rect[0]);
// 3. 使用float[]类型传递参数(或者参考 1)
jfloat *arr = env->GetFloatArrayElements(featurearray, NULL);
for(int i=0;i<128;i++){
float temp=face_descriptors[0](0,i);
arr[i]=temp;
}
}
向jni函数中传递Bitmap, 转换为Mat:
JNIEXPORT jboolean
JNICALL
Java_camera_hj_cameracontroller_EasyPR_EasyPR_getPlate
(JNIEnv *env, jobject obj,
jobject bmpIn //bitmap
){
//convert bitmap to Mat
void* inPixelsAddress;
AndroidBitmapInfo inBmpInfo;
int ret;
if ((ret = AndroidBitmap_getInfo(env, bmpIn, &inBmpInfo)) < 0) {
LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
return false;
}
if ((ret = AndroidBitmap_lockPixels(env, bmpIn, &inPixelsAddress)) < 0) {
LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
}
Mat srcImage(inBmpInfo.height, inBmpInfo.width,
CV_8UC4, inPixelsAddress);
//在一些c++函数中,srcImage类型需要是三通道的。
cv::cvtColor(srcImage,srcImage,CV_BGRA2BGR);
//your code next
....
}
todo:
使用一维数组向jni函数传参,二维数组传参,参考:
http://blog.youkuaiyun.com/ya_meidei/article/details/52923791