【发布时间】:2016-08-01 13:34:03
【问题描述】:
我正在尝试使用 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(). -
我尝试用
%d打印它的值,它为我打印了 1,这是意料之中的。 -
无论如何,你能发布
segment_offline()的定义吗?你为什么要使用cast toint *?函数已经有正确的返回类型。 -
我已经发布了
segment_offilne()的定义并标记了我得到分段错误的地方。 -
JNI 规定
jint/jfloat/jdouble的大小为 32/32/64 位。您确定这与您运行它的任何架构上的 Cint/float/double类型的大小相匹配吗?
标签: android c pointers android-ndk java-native-interface