android开发 Jni函数中传参

使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值