有一段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;
}
大家有知道的吗?可以回复下我