我正在尝试使用NDK在Android中编写本地C代码。我有一个函数segment_offline()
,它接受许多参数,包括整数指针int * num_segments
。我想要这个指针,因为我想在我的C
函数中读取此指针所指向的整数值,该函数作为我的JNI接口。以下是segment_offline()
的代码:
int * segment_offline(const SEGMENT_DATATYPE *x, const int num_samples_x, const float *svara_cents, const int *svara_lengths, const int num_svaras, const int type, const int hop_size, const float tonic, int *num_segments) {
int i;
// using DTW ...
if (0 == type) {
filtered_samples_t fns;
// removing the negative frequencies in Hz.
filter_negative_samples(x, num_samples_x, &fns);
__android_log_print(ANDROID_LOG_DEBUG, "LogNDK", "After filter_negative_samples\n");
// converting the Hz to Cents
convert_pitch_to_cents(fns.arr_filtered, fns.len, tonic);
__android_log_print(ANDROID_LOG_DEBUG, "LogNDK", "After convert_pitch_to_cents\n");
//print_double_array(fns.arr_filtered, fns.len);
segments_t seg = segment_offline_dtw(fns.arr_filtered, fns.len, svara_cents, svara_lengths, num_svaras, hop_size);
__android_log_print(ANDROID_LOG_DEBUG, "LogNDK", "After segment_offline_dtw\n");
int * ret_segments = (int *) malloc(sizeof(seg.num_segments));
__android_log_print(ANDROID_LOG_DEBUG, "LogNDK", "After allocating memory to ret_segments\n");
// setting the value of the number of segments in the pointer that would be referred.
// ########## I get a segmentation fault here #########
__android_log_print(ANDROID_LOG_DEBUG, "LogNDK", "The number of segments are: %d\n", seg.num_segments);
*num_segments = seg.num_segments;
__android_log_print(ANDROID_LOG_DEBUG, "LogNDK", "After assigning the number of segments: %d\n", *num_segments);
for (i = 0;i < seg.num_segments * 2; i++) {
ret_segments[i] = fns.original_indices[seg.segments_pos[i]];
printf("%d, ", ret_segments[i]);
}
printf("\n");
__android_log_print(ANDROID_LOG_DEBUG, "LogNDK", "Returning from segment_offline\n");
return ret_segments;
}
我编写的JNI C函数如下:
JNIEXPORT jintArray JNICALL Java_com_camut_audioiolib_dsp_DSPAlgorithms_segmentOffline
(JNIEnv *env, jclass cls, jdoubleArray x, jint numSamples, jfloatArray svaraCents,
jintArray svaraLengths, jint numSvaras, jint type, jint hopSize, jfloat tonic) {
jdouble *xDouble = (*env)->GetDoubleArrayElements(env, x, NULL);
jfloat *svaraCentsFloat = (*env)->GetFloatArrayElements(env, svaraCents, NULL);
jint *svaraLengthsInt = (*env)->GetIntArrayElements(env, svaraLengths, NULL);
__android_log_print(ANDROID_LOG_DEBUG, "LogNDK", "The size of the type tonic is: %d", sizeof(tonic));
int num_segments;
int * segments = (int *) segment_offline(xDouble, numSamples, svaraCentsFloat, svaraLengthsInt,
numSvaras, type, hopSize, tonic, &num_segments);
if (NULL == segments) {
return NULL;
}
// releasing the allocated memories ...
(*env)->ReleaseDoubleArrayElements(env, x, xDouble, JNI_ABORT);
(*env)->ReleaseFloatArrayElements(env, svaraCents, svaraCentsFloat, JNI_ABORT);
(*env)->ReleaseIntArrayElements(env, svaraLengths, svaraLengthsInt, JNI_ABORT);
return NULL;
}
你可以看到上面的代码中,我已经初始化了一个
num_segments
作为int
变量,并将该变量的地址传递给上述函数。因此,似乎我无法对int
指针进行解引用操作。你有什么建议吗?我需要这个指针,因为我正在返回其他值作为我的函数返回值。
seg.num_segments
是什么?请发布完整的segment_offline()
函数。 - Sergio%d
打印它的值,结果打印出1,这是可以预料的。 - Swapnilsegment_offline()
的定义吗?另外为什么要使用int *
类型转换?函数已经有了正确的返回类型。 - Sergiosegment_offline()
的定义,并标记了我遇到分段错误的地方。 - Swapniljint
/jfloat
/jdouble
的大小为32/32/64位。您确定这与您正在运行的任何架构上的Cint
/float
/double
类型的大小相匹配吗? - Michael