gpt4 book ai didi

android - 当传递给 JNI 层下的 C 函数时,指针的地址发生变化

转载 作者:太空狗 更新时间:2023-10-29 13:12:22 25 4
gpt4 key购买 nike

我正在尝试使用 NDK 在 Android 中编写 native C 代码。我有一个函数 segment_offline(),它接受许多参数,包括一个整数指针 int * num_segments。我想要这个指针,因为我想在我的 C 函数中读取分配给这个指针指向的整数的值,该函数充当我的 JNI 接口(interface)。以下是 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 指针。对此有任何建议。我需要这个指针,因为我正在返回其他值作为我的函数返回值。

最佳答案

只是猜测。有人在取消引用之前损坏了您的 num_segments。尝试在函数开始时立即打印它的值,然后在崩溃行之前打印它的值。崩溃日志还显示 SIGSEGV 出现在地址 0x60000000 上,这不太可能是堆栈对象的地址。

编辑

不正确的参数值也可能是由调用错误声明的函数引起的,即,如果您调用了尚未定义或在另一个翻译单元中定义的函数 - 您必须提供前向声明,告诉编译器有关实际参数列表和返回类型。请注意,C89 允许隐式函数声明。如果您不声明函数 - 编译器假定它具有 int 返回类型并接受任意数量的任意参数。 See here for details .请注意,定义和调用签名的不匹配会导致未定义的行为。

附言此外,缺少前向声明可能会强制您转换函数返回,因为编译器期望它是 int

关于android - 当传递给 JNI 层下的 C 函数时,指针的地址发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38700283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com