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

时间:2013-11-18 18:06:05

标签: java c arrays java-native-interface

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

我现在的问题是如何在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_OR_DBL被定义为Float或Double:

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;
}

如果有必要,我也可以在库中提供确切的实现。

\ edit:http://pastebin.com/ayGg2HBR

的精确实施

1 个答案:

答案 0 :(得分:1)

你知道有多少双指针被退回吗?如果没有,您首先需要计算,然后:

// 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;