使用JNI将指向双数组的C指针传递给Java

使用JNI将指向双数组的C指针传递给Java,java,c,arrays,java-native-interface,Java,C,Arrays,Java Native Interface,我试图通过JNI在Java程序中使用外部C库。我需要使用两个函数,第一个是C中的计算,并将一些结果存储在一个双数组中,第二个函数然后返回指向这个双数组的指针 我现在的问题是如何在Java中访问/使用这个双数组 JNI代码: JNIEXPORT jdoubleArray JNICALL Java_rna_jni_ViennaRNAInterface_getBasePairingProbabilities(JNIEnv *env, jobject thisObj, jstring sequence)

我试图通过JNI在Java程序中使用外部C库。我需要使用两个函数,第一个是C中的计算,并将一些结果存储在一个双数组中,第二个函数然后返回指向这个双数组的指针

我现在的问题是如何在Java中访问/使用这个双数组

JNI代码:

JNIEXPORT jdoubleArray JNICALL Java_rna_jni_ViennaRNAInterface_getBasePairingProbabilities(JNIEnv *env, jobject thisObj, jstring sequence){

    jdoubleArray dArray;
    const char *seq= (*env)->GetStringUTFChars(env,sequence,0);

    // Calculates a single value, stores important results in double array
    pf_fold_par(seq,NULL,NULL,1,0,0); 

    // export_bppm() returns pointer to double array
    double* pr = export_bppm();

    // Processing of double array

    return dArray;
}
C库中的代码基本上如下所示,
FLT_或_DBL
定义为浮点或双精度:

PRIVATE FLT_OR_DBL  *probs=NULL;

PRIVATE void get_arrays(unsigned int length){
    size  = sizeof(FLT_OR_DBL) * ((length+1)*(length+2)/2);
    probs = (FLT_OR_DBL *) space(size);
}

PUBLIC float pf_fold_par(const char *sequence,char *structure, pf_paramT *parameters,int calculate_bppm,int is_constrained, int is_circular){
    float result;
    int n = (int) strlen(sequence);

    get_arrays(n);

    /*
    * Calculating result
    */

    // Fill double array
    pf_create_bppm(sequence, structure); 
    pr = probs;

    return result;
}
如有必要,我也可以在库中提供确切的实现


\编辑:精确实现在

您知道返回了多少个双指针吗?如果不是,您首先需要计算,然后:

// export_bppm() returns pointer to double array
double* pr = export_bppm();

//Determine # of doubles @ pr; didn't test this, just guessing at result structure
int count = 0;
double *start = pr;
while( start++ != null )
    count++;

// Processing of double array
jdoubleArray dArray = env->NewDoubleArray( count );

env->SetDoubleArrayRegion( dArray , 0, count, pr );

return dArray;

不幸的是,while循环无限运行。我使用传递给函数的jstring的长度来确定数组中元素的数量,因为它们应该是相同的。@dennis如我所说,我猜测了确定返回元素的数量;通过使用jstring的长度作为计数,它解决了您的需要吗?技术上是的。不幸的是,我不确定返回的数组是否正确,因为它的大多数元素都是0,我也不确定返回的数组是否应该不同。但这当然是一个不同的问题不是你的问题,而是…pf\u fold\u par需要哪个字符集和编码?它不太可能被UTF-8编码的Unicode修改。也许您应该从
String.getBytes(Charset)
向它传递一个字节数组,或者,对于Java确定的系统默认字符集,
String.getBytes()
。它看起来确实需要以0结尾,但一定要考虑到这一点。
GetStringUTFChars
方法工作正常,我在库中也使用了一个不同的函数,它可以毫无问题地处理编码。我不太熟悉编码,但字符串只能包含A、C、G或U可能会有所帮助。没有字符集和编码,就不能有字符。字符集将概念映射到数字(代码点),编码将代码点映射到字节。(字体[字体]将字符映射为字形,但这是另一回事。)但幸运的是,几乎所有字符集都包含“基本拉丁”字符,许多编码将它们编码为相同的单字节。这是故意的。但对于其他字符,修改后的UTF-8使用一个、两个、三个或六个字节。