TommyWu01 2021-10-20 17:18 采纳率: 0%
浏览 45
已结题

JNI操作C代码返回二维数组数据怎么弄?

有一段C代码如下,想改为JNI方式后生成.so或.dll文件给java调用,但是不知道怎么弄。

/*************************************************************************
* @brief   :  滤波后PPG信号:分割
* @inparam :  double* y    PPG signal
              int lenth   信号长度
* @outparam:  double(*v1)[MAX_LINE]    分割后的二维数组
* @return:  0
* @author  :  YY Chen
* @date    :  2021/08/26 12:40
* @version :  ver 1.0
*************************************************************************/
int Data_segmentation(double* y, double(*v1)[MAX_LINE], int lenth)
{
    int Fsize = 0;
    int flag = 0, flag1 = 0;
    int i, j = 0, m, n;
    double  v[MAX_LINE];
    int count = Overlap_rate;
    //start→Data segmentation
    for (m = 0; m < lenth; m++)
    {
        if (flag == 0) {
            if (y) {
                v[Fsize++] = y[m];
            }
            if (Fsize == MAX_LINE) {
                Fsize = 0;
                for (int i = 0; i < MAX_LINE; i++) {
                    v1[j][i] = v[i];
                }
                j++;
                flag1 = 1;
            }
        }

        if (flag == 1) {
            v1[j][count++] = y[m];
            flag1 = 0;
            if (count == MAX_LINE) {
                count = Overlap_rate;
                j++;
                flag1 = 1;
            }
        }


        if (flag1 == 1) {
            for (int i = Step_length; i < MAX_LINE; i++) {
                v1[j][i - Step_length] = v1[j - 1][i];
            }
            flag = 1;
        }
        if (j == 200) break;

    }
    //end←Data segmentation
    return 0;
}


我自己尝试改了下,但执行报错,不知道哪里有问题,有牛人知道吗?

/*************************************************************************
* @brief   :  滤波后PPG信号:分割
* @inparam :  double* y    PPG signal
              int lenth   信号长度
* @outparam:  double(*v1)[MAX_LINE]    分割后的二维数组
* @return:  0
* @author  :  YY Chen
* @date    :  2021/08/26 12:40
* @version :  ver 1.0
*************************************************************************/
JNIEXPORT jobjectArray JNICALL Java_packecg_Prs_dataSegmentation(JNIEnv *env,jobject obj,jdoubleArray y,jint lenth)
{
    int ONE_DIMENSION = 200;
    int TWO_DIMENSION = 1000;
    double v1[ONE_DIMENSION][TWO_DIMENSION];
    int Fsize = 0;
    int flag = 0, flag1 = 0;
    int i, j = 0, m, n;
    double  v[MAX_LINE];
    int count = Overlap_rate;
    //start→Data segmentation
    //根据Java数组创建C数组,也就是把Java数组转换成C数组
    double *y_buf = (*env)->GetDoubleArrayElements(env,y,0);
    for (m = 0; m < lenth; m++)
    {
        if (flag == 0) {
            if (y_buf) {
                v[Fsize++] = y_buf[m];
            }
            if (Fsize == MAX_LINE) {
                Fsize = 0;
                for (int i = 0; i < MAX_LINE; i++) {
                    v1[j][i] = v[i];
                }
                j++;
                flag1 = 1;
            }
        }

        if (flag == 1) {
            v1[j][count++] = y_buf[m];
            flag1 = 0;
            if (count == MAX_LINE) {
                count = Overlap_rate;
                j++;
                flag1 = 1;
            }
        }

        if (flag1 == 1) {
            for (int i = Step_length; i < MAX_LINE; i++) {
                v1[j][i - Step_length] = v1[j - 1][i];
            }
            flag = 1;
        }
        if (j == 200) break;


    }
    //end←Data segmentation
    
    //start→return array
    jobjectArray jobjArr;
    jclass intArr = (*env)->FindClass(env,"[I");
    jobjArr = (*env)->NewObjectArray(env,ONE_DIMENSION * TWO_DIMENSION, intArr, NULL);
    jint temp[ONE_DIMENSION];
    for (jint i = 0; i < ONE_DIMENSION; i++){
        jintArray colArr = (*env)->NewIntArray(env,ONE_DIMENSION);
        for (jint j = 0; j < TWO_DIMENSION; j++)
        {
            temp[j] = v1[i][j];
        }
        (*env)->SetIntArrayRegion(env,colArr,0,ONE_DIMENSION,temp);
        (*env)->SetObjectArrayElement(env,jobjArr,i,colArr);
        (*env)->DeleteLocalRef(env,colArr);
    }
    return jobjArr;
    //end→return array
    //return 0;
}


大家有知道的吗?可以回复下我

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月28日
    • 创建了问题 10月20日

    悬赏问题

    • ¥15 2020长安杯与连接网探
    • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
    • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
    • ¥16 mybatis的代理对象无法通过@Autowired装填
    • ¥15 可见光定位matlab仿真
    • ¥15 arduino 四自由度机械臂
    • ¥15 wordpress 产品图片 GIF 没法显示
    • ¥15 求三国群英传pl国战时间的修改方法
    • ¥15 matlab代码代写,需写出详细代码,代价私
    • ¥15 ROS系统搭建请教(跨境电商用途)