使用JNI将指向双数组的C指针传递给Java
我试图通过JNI在Java程序中使用外部C库。我需要使用两个函数,第一个是C中的计算,并将一些结果存储在一个双数组中,第二个函数然后返回指向这个双数组的指针 我现在的问题是如何在Java中访问/使用这个双数组 JNI代码:使用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)
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使用一个、两个、三个或六个字节。