У меня очень большой буфер символов в C, и мне нужно скопировать некоторую его часть в массив Java.
В частности, мне нужны элементы, начиная с 16,384 и заканчивая 32000. Как я могу это сделать?
Изначально я попробовал это:
jbyte * bytes = (* env) -> GetByteArrayElements (env, array, NULL);
memmove (bytes, (jbyte *) buffer, buffer_size);
(* Env) -> ReleaseByteArrayElements (env, array, (jbyte *) bytes, 0);
(* Env) -> CallStaticVoidMethod (env, cls, mid, buffer_size);
Но с этим кодом передается весь буфер, и он очень большой (более 40 МБ). Мне нужна только небольшая часть буфера.
EDIT:
Большое спасибо, но ваша версия не совсем работает. Я применил это следующим образом:
memmove (массив, (jbyte *) (буфер + числа), 16385);
в буфер - на каждую итерацию копируется в «буфер» новые 16384 байта.
такие цифры в размере буфера и числа соответственно:
16384 - 0
32,768 - 16,385
49152 - 32769
65536 - 49153
81,920 - 65,537
98 304 - 81 921
Т.е. на каждой итерации по очереди в «числах» правого столбца.
В результате - скопированные байты не всегда успешны. Первая итерация всегда успешна. Далее по очереди и удачно, и неудачно. memtcpy дает тот же результат. Что посоветуете? Как решить проблему?
EDIT2:
Мой код:
JNIEXPORT jint work (JNIEnv * env, jobject obj, jbyteArray array)
{
int argc;
char * args [3];
char * argv [3];
argv [1] = "Music/Tg.mp3";
argv [2] = "testwavS3.flac";
argc = 3;
sox_effects_chain_t * chain;
sox_effect_t * e;
static sox_format_t * in, * out; / * input and output files * /
char * buffer;
size_t buffer_size;
size_t number_read;
/ * All libSoX applications must start by initialising the SoX library * /
sox_init ();
/ * Open the input file (with default parameters) * /
in = sox_open_read (argv [1], NULL, NULL, NULL);
# Define MAX_SAMPLES (size_t) 8192
__android_log_write (ANDROID_LOG_ERROR, "Read", "Haha");
sox_sample_t samples [MAX_SAMPLES]; / * Temporary store whilst copying. * /
jclass cls;
jmethodID mid, mid2;
cls = (* env) -> GetObjectClass (env, obj);
mid = (* env) -> GetStaticMethodID (env, cls, "testt",
"(I) V");
jbyteArray bytearrayBuffer = (* env) -> NewByteArray (env, & in-> signal.length); / / construct a new byte array
out = sox_open_memstream_write (& buffer, & buffer_size, & in-> signal, NULL, "sox", NULL);
int numbers = 0;
in-> encoding.bits_per_sample = 16;
out-> encoding.bits_per_sample = 16;
(* Env) -> GetByteArrayElements (env, array, NULL);
while (number_read = sox_read (in, samples, MAX_SAMPLES)) {
sox_write (out, samples, number_read);
memmove (array, (jbyte *) (buffer + numbers), (buffer_size-numbers));
numbers + = buffer_size-numbers;
(* Env) -> CallStaticVoidMethod (env, cls, mid, buffer_size);
}
sox_close (out);
sox_close (in);
# If! Defined FIXED_BUFFER
free (buffer);
# Endif
}
Использование SoX для декодирования аудио и выдачи буфера в Java.