Files
KCompressor/app/src/main/cpp/native_compressor.cpp
T
2026-06-12 03:47:52 +07:00

116 lines
3.9 KiB
C++

#include <jni.h>
#include <string>
#include "compressor_common.h"
#include "video_compressor.h"
#include "image_compressor.h"
static std::string jstring_to_string(JNIEnv *env, jstring value, const char *fallback) {
if (!env || !value) {
return fallback ? std::string(fallback) : std::string();
}
const char *chars = env->GetStringUTFChars(value, nullptr);
if (!chars) {
return fallback ? std::string(fallback) : std::string();
}
std::string result(chars);
env->ReleaseStringUTFChars(value, chars);
return result;
}
extern "C"
JNIEXPORT void JNICALL
Java_com_kikyps_kcompressor_NativeCompressor_cancelCurrentJob(JNIEnv *, jclass) {
set_cancel_requested(true);
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_kikyps_kcompressor_NativeCompressor_compressFd(JNIEnv *env,
jclass,
jint inputFd,
jint outputFd,
jint targetShortSide,
jint inputRotationDegrees,
jint crf,
jstring encoderName,
jstring preset,
jstring audioMode,
jint audioBitrate,
jobject callback) {
std::string encoder = jstring_to_string(env, encoderName, "libx264");
std::string preset_str = jstring_to_string(env, preset, "medium");
std::string audio_mode = jstring_to_string(env, audioMode, "copy");
if (encoder != "libx264" && encoder != "libx265") {
encoder = "libx264";
}
if (targetShortSide < 0) targetShortSide = 0;
if (crf < 0) crf = 26;
if (crf > 51) crf = 51;
if (audio_mode != "copy" && audio_mode != "aac" && audio_mode != "mute") {
audio_mode = "copy";
}
if (audioBitrate <= 0) {
audioBitrate = 128000;
}
reset_cancel_requested();
int ret = compress_video_fd_impl(
env,
static_cast<int>(inputFd),
static_cast<int>(outputFd),
static_cast<int>(targetShortSide),
static_cast<int>(inputRotationDegrees),
static_cast<int>(crf),
encoder,
preset_str,
audio_mode,
static_cast<int>(audioBitrate),
callback
);
return static_cast<jint>(ret);
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_kikyps_kcompressor_NativeCompressor_compressImageFd(JNIEnv *env,
jclass,
jint inputFd,
jint outputFd,
jstring inputMime,
jstring outputFormat,
jint quality,
jint maxLongSide,
jobject callback) {
std::string mime = jstring_to_string(env, inputMime, "");
std::string format = jstring_to_string(env, outputFormat, "jpeg");
if (quality < 1) quality = 1;
if (quality > 100) quality = 100;
if (maxLongSide < 0) maxLongSide = 0;
reset_cancel_requested();
int ret = compress_image_fd_impl(
env,
static_cast<int>(inputFd),
static_cast<int>(outputFd),
mime,
format,
static_cast<int>(quality),
static_cast<int>(maxLongSide),
callback
);
return static_cast<jint>(ret);
}