我试图通过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
的精确实施答案 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;