llama-cpp-pro 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +295 -0
- package/LICENSE +21 -0
- package/LlamaCpp.podspec +33 -0
- package/LlamaCppCapacitor.podspec +33 -0
- package/Package.swift +29 -0
- package/README.md +93 -0
- package/android/build.gradle +88 -0
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/CMakeLists-arm64.txt +138 -0
- package/android/src/main/CMakeLists-x86_64.txt +141 -0
- package/android/src/main/CMakeLists.txt +138 -0
- package/android/src/main/java/ai/annadata/plugin/capacitor/LlamaCpp.java +1340 -0
- package/android/src/main/java/ai/annadata/plugin/capacitor/LlamaCppPlugin.java +814 -0
- package/android/src/main/java/ai/annadata/plugin/capacitor/ModelAdmissionController.java +214 -0
- package/android/src/main/jni-chat-session.cpp +261 -0
- package/android/src/main/jni-lora.cpp +197 -0
- package/android/src/main/jni-multimodal.cpp +167 -0
- package/android/src/main/jni-tts.cpp +290 -0
- package/android/src/main/jni-utils.h +148 -0
- package/android/src/main/jni.cpp +1808 -0
- package/android/src/main/jniLibs/arm64-v8a/libllama-cpp-arm64.so +0 -0
- package/android/src/main/res/.gitkeep +0 -0
- package/build-native.sh +280 -0
- package/cmake/desktop-metal-embed.cmake +30 -0
- package/cmake/desktop-sources.cmake +100 -0
- package/cmake/ggml-backends.cmake +44 -0
- package/cpp/LICENSE +21 -0
- package/cpp/README.md +15 -0
- package/cpp/anyascii.c +22223 -0
- package/cpp/anyascii.h +42 -0
- package/cpp/cap-completion.cpp +942 -0
- package/cpp/cap-completion.h +127 -0
- package/cpp/cap-embedding.cpp +193 -0
- package/cpp/cap-embedding.h +35 -0
- package/cpp/cap-ios-bridge.cpp +1810 -0
- package/cpp/cap-ios-bridge.h +61 -0
- package/cpp/cap-llama.cpp +412 -0
- package/cpp/cap-llama.h +161 -0
- package/cpp/cap-mtmd.hpp +602 -0
- package/cpp/cap-native-server.cpp +1095 -0
- package/cpp/cap-native-server.h +40 -0
- package/cpp/cap-tts.cpp +591 -0
- package/cpp/cap-tts.h +59 -0
- package/cpp/cap-wasm-fs.cpp +156 -0
- package/cpp/cap-wasm-jspi.cpp +19 -0
- package/cpp/cap-wasm-jspi.h +30 -0
- package/cpp/cap-wasm-vfs.cpp +22 -0
- package/cpp/chat-parser.cpp +393 -0
- package/cpp/chat-parser.h +120 -0
- package/cpp/chat.cpp +2315 -0
- package/cpp/chat.h +221 -0
- package/cpp/common.cpp +1664 -0
- package/cpp/common.h +744 -0
- package/cpp/ggml-alloc.c +1028 -0
- package/cpp/ggml-alloc.h +76 -0
- package/cpp/ggml-backend-impl.h +255 -0
- package/cpp/ggml-backend-reg.cpp +600 -0
- package/cpp/ggml-backend.cpp +2121 -0
- package/cpp/ggml-backend.h +354 -0
- package/cpp/ggml-common.h +1878 -0
- package/cpp/ggml-cpp.h +39 -0
- package/cpp/ggml-cpu/amx/amx.cpp +221 -0
- package/cpp/ggml-cpu/amx/amx.h +8 -0
- package/cpp/ggml-cpu/amx/common.h +91 -0
- package/cpp/ggml-cpu/amx/mmq.cpp +2512 -0
- package/cpp/ggml-cpu/amx/mmq.h +10 -0
- package/cpp/ggml-cpu/arch/arm/cpu-feats.cpp +94 -0
- package/cpp/ggml-cpu/arch/arm/quants.c +3650 -0
- package/cpp/ggml-cpu/arch/arm/repack.cpp +1891 -0
- package/cpp/ggml-cpu/arch/x86/cpu-feats.cpp +327 -0
- package/cpp/ggml-cpu/arch/x86/quants.c +3820 -0
- package/cpp/ggml-cpu/arch/x86/repack.cpp +6307 -0
- package/cpp/ggml-cpu/arch-fallback.h +215 -0
- package/cpp/ggml-cpu/binary-ops.cpp +158 -0
- package/cpp/ggml-cpu/binary-ops.h +16 -0
- package/cpp/ggml-cpu/common.h +73 -0
- package/cpp/ggml-cpu/ggml-cpu-impl.h +559 -0
- package/cpp/ggml-cpu/ggml-cpu.c +3578 -0
- package/cpp/ggml-cpu/ggml-cpu.cpp +672 -0
- package/cpp/ggml-cpu/ops.cpp +10587 -0
- package/cpp/ggml-cpu/ops.h +114 -0
- package/cpp/ggml-cpu/quants.c +1193 -0
- package/cpp/ggml-cpu/quants.h +97 -0
- package/cpp/ggml-cpu/repack.cpp +1982 -0
- package/cpp/ggml-cpu/repack.h +120 -0
- package/cpp/ggml-cpu/simd-mappings.h +1184 -0
- package/cpp/ggml-cpu/traits.cpp +36 -0
- package/cpp/ggml-cpu/traits.h +38 -0
- package/cpp/ggml-cpu/unary-ops.cpp +186 -0
- package/cpp/ggml-cpu/unary-ops.h +28 -0
- package/cpp/ggml-cpu/vec.cpp +348 -0
- package/cpp/ggml-cpu/vec.h +1121 -0
- package/cpp/ggml-cpu.h +145 -0
- package/cpp/ggml-impl.h +622 -0
- package/cpp/ggml-metal-impl.h +688 -0
- package/cpp/ggml-metal.h +66 -0
- package/cpp/ggml-metal.m +6833 -0
- package/cpp/ggml-metal.metal +10754 -0
- package/cpp/ggml-opt.cpp +1093 -0
- package/cpp/ggml-opt.h +256 -0
- package/cpp/ggml-quants.c +5324 -0
- package/cpp/ggml-quants.h +106 -0
- package/cpp/ggml-threading.cpp +12 -0
- package/cpp/ggml-threading.h +14 -0
- package/cpp/ggml.c +7108 -0
- package/cpp/ggml.h +2492 -0
- package/cpp/gguf.cpp +1358 -0
- package/cpp/gguf.h +202 -0
- package/cpp/json-partial.cpp +256 -0
- package/cpp/json-partial.h +38 -0
- package/cpp/json-schema-to-grammar.cpp +985 -0
- package/cpp/json-schema-to-grammar.h +21 -0
- package/cpp/llama-adapter.cpp +388 -0
- package/cpp/llama-adapter.h +76 -0
- package/cpp/llama-arch.cpp +2355 -0
- package/cpp/llama-arch.h +499 -0
- package/cpp/llama-batch.cpp +875 -0
- package/cpp/llama-batch.h +160 -0
- package/cpp/llama-chat.cpp +783 -0
- package/cpp/llama-chat.h +65 -0
- package/cpp/llama-context.cpp +2788 -0
- package/cpp/llama-context.h +306 -0
- package/cpp/llama-cparams.cpp +5 -0
- package/cpp/llama-cparams.h +41 -0
- package/cpp/llama-cpp.h +30 -0
- package/cpp/llama-grammar.cpp +1229 -0
- package/cpp/llama-grammar.h +173 -0
- package/cpp/llama-graph.cpp +1891 -0
- package/cpp/llama-graph.h +810 -0
- package/cpp/llama-hparams.cpp +180 -0
- package/cpp/llama-hparams.h +233 -0
- package/cpp/llama-impl.cpp +167 -0
- package/cpp/llama-impl.h +61 -0
- package/cpp/llama-io.cpp +15 -0
- package/cpp/llama-io.h +35 -0
- package/cpp/llama-kv-cache-iswa.cpp +318 -0
- package/cpp/llama-kv-cache-iswa.h +135 -0
- package/cpp/llama-kv-cache.cpp +2059 -0
- package/cpp/llama-kv-cache.h +374 -0
- package/cpp/llama-kv-cells.h +491 -0
- package/cpp/llama-memory-hybrid.cpp +258 -0
- package/cpp/llama-memory-hybrid.h +137 -0
- package/cpp/llama-memory-recurrent.cpp +1146 -0
- package/cpp/llama-memory-recurrent.h +179 -0
- package/cpp/llama-memory.cpp +59 -0
- package/cpp/llama-memory.h +119 -0
- package/cpp/llama-mmap.cpp +609 -0
- package/cpp/llama-mmap.h +68 -0
- package/cpp/llama-model-loader.cpp +1166 -0
- package/cpp/llama-model-loader.h +170 -0
- package/cpp/llama-model-saver.cpp +282 -0
- package/cpp/llama-model-saver.h +37 -0
- package/cpp/llama-model.cpp +19061 -0
- package/cpp/llama-model.h +491 -0
- package/cpp/llama-sampling.cpp +2575 -0
- package/cpp/llama-sampling.h +32 -0
- package/cpp/llama-vocab.cpp +3792 -0
- package/cpp/llama-vocab.h +176 -0
- package/cpp/llama.cpp +358 -0
- package/cpp/llama.h +1373 -0
- package/cpp/log.cpp +428 -0
- package/cpp/log.h +103 -0
- package/cpp/minja/chat-template.hpp +550 -0
- package/cpp/minja/minja.hpp +3009 -0
- package/cpp/nlohmann/json.hpp +25526 -0
- package/cpp/nlohmann/json_fwd.hpp +187 -0
- package/cpp/regex-partial.cpp +204 -0
- package/cpp/regex-partial.h +56 -0
- package/cpp/sampling.cpp +579 -0
- package/cpp/sampling.h +107 -0
- package/cpp/tools/mtmd/clip-impl.h +473 -0
- package/cpp/tools/mtmd/clip.cpp +4322 -0
- package/cpp/tools/mtmd/clip.h +106 -0
- package/cpp/tools/mtmd/miniaudio/miniaudio.h +93468 -0
- package/cpp/tools/mtmd/mtmd-audio.cpp +769 -0
- package/cpp/tools/mtmd/mtmd-audio.h +47 -0
- package/cpp/tools/mtmd/mtmd-helper.cpp +460 -0
- package/cpp/tools/mtmd/mtmd-helper.h +95 -0
- package/cpp/tools/mtmd/mtmd.cpp +1066 -0
- package/cpp/tools/mtmd/mtmd.h +302 -0
- package/cpp/tools/mtmd/stb/stb_image.h +7988 -0
- package/cpp/unicode-data.cpp +7034 -0
- package/cpp/unicode-data.h +20 -0
- package/cpp/unicode.cpp +1061 -0
- package/cpp/unicode.h +68 -0
- package/cpp/vendor/cpp-httplib/httplib.cpp +16509 -0
- package/cpp/vendor/cpp-httplib/httplib.h +3883 -0
- package/desktop/electron-builder.config.cjs +157 -0
- package/desktop/entitlements.mac.plist +12 -0
- package/desktop/package.json +11 -0
- package/desktop/resolve-package-root.cjs +88 -0
- package/desktop/src/main/backend-selector.cjs +148 -0
- package/desktop/src/main/gpu-probe.cjs +142 -0
- package/desktop/src/main/index.cjs +58 -0
- package/desktop/src/main/ipc-handlers.cjs +212 -0
- package/desktop/src/main/model-store.cjs +50 -0
- package/desktop/src/main/preload.cjs +39 -0
- package/desktop/src/main/sidecar-client.cjs +76 -0
- package/desktop/src/main/sidecar-manager.cjs +364 -0
- package/dist/docs.json +14357 -0
- package/dist/esm/definitions.d.ts +731 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/desktop.d.ts +37 -0
- package/dist/esm/desktop.js +133 -0
- package/dist/esm/desktop.js.map +1 -0
- package/dist/esm/index.d.ts +200 -0
- package/dist/esm/index.js +612 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/isomorphic/desktop.runtime.d.ts +37 -0
- package/dist/esm/isomorphic/desktop.runtime.js +36 -0
- package/dist/esm/isomorphic/desktop.runtime.js.map +1 -0
- package/dist/esm/isomorphic/errors.d.ts +6 -0
- package/dist/esm/isomorphic/errors.js +9 -0
- package/dist/esm/isomorphic/errors.js.map +1 -0
- package/dist/esm/isomorphic/model.admission.d.ts +17 -0
- package/dist/esm/isomorphic/model.admission.js +27 -0
- package/dist/esm/isomorphic/model.admission.js.map +1 -0
- package/dist/esm/isomorphic/model.scheduler.d.ts +31 -0
- package/dist/esm/isomorphic/model.scheduler.js +95 -0
- package/dist/esm/isomorphic/model.scheduler.js.map +1 -0
- package/dist/esm/isomorphic/provider.desktop.d.ts +40 -0
- package/dist/esm/isomorphic/provider.desktop.js +411 -0
- package/dist/esm/isomorphic/provider.desktop.js.map +1 -0
- package/dist/esm/isomorphic/provider.factory.d.ts +2 -0
- package/dist/esm/isomorphic/provider.factory.js +16 -0
- package/dist/esm/isomorphic/provider.factory.js.map +1 -0
- package/dist/esm/isomorphic/provider.interface.d.ts +76 -0
- package/dist/esm/isomorphic/provider.interface.js +2 -0
- package/dist/esm/isomorphic/provider.interface.js.map +1 -0
- package/dist/esm/isomorphic/provider.native.d.ts +18 -0
- package/dist/esm/isomorphic/provider.native.js +173 -0
- package/dist/esm/isomorphic/provider.native.js.map +1 -0
- package/dist/esm/isomorphic/provider.web.d.ts +88 -0
- package/dist/esm/isomorphic/provider.web.js +573 -0
- package/dist/esm/isomorphic/provider.web.js.map +1 -0
- package/dist/esm/isomorphic/sidecar-sse.d.ts +14 -0
- package/dist/esm/isomorphic/sidecar-sse.js +76 -0
- package/dist/esm/isomorphic/sidecar-sse.js.map +1 -0
- package/dist/esm/isomorphic/wasmMemoryCalibration.d.ts +26 -0
- package/dist/esm/isomorphic/wasmMemoryCalibration.js +60 -0
- package/dist/esm/isomorphic/wasmMemoryCalibration.js.map +1 -0
- package/dist/esm/isomorphic/wasmMemoryPolicy.d.ts +55 -0
- package/dist/esm/isomorphic/wasmMemoryPolicy.js +93 -0
- package/dist/esm/isomorphic/wasmMemoryPolicy.js.map +1 -0
- package/dist/esm/storage/manifest.d.ts +13 -0
- package/dist/esm/storage/manifest.js +87 -0
- package/dist/esm/storage/manifest.js.map +1 -0
- package/dist/esm/storage/opfs.store.d.ts +31 -0
- package/dist/esm/storage/opfs.store.js +241 -0
- package/dist/esm/storage/opfs.store.js.map +1 -0
- package/dist/esm/web.d.ts +206 -0
- package/dist/esm/web.js +521 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/esm/workers/async-file.d.ts +13 -0
- package/dist/esm/workers/async-file.js +12 -0
- package/dist/esm/workers/async-file.js.map +1 -0
- package/dist/esm/workers/heapfs.d.ts +55 -0
- package/dist/esm/workers/heapfs.js +115 -0
- package/dist/esm/workers/heapfs.js.map +1 -0
- package/dist/esm/workers/wasm.engine.d.ts +86 -0
- package/dist/esm/workers/wasm.engine.js +504 -0
- package/dist/esm/workers/wasm.engine.js.map +1 -0
- package/dist/esm/workers/worker.protocol.d.ts +160 -0
- package/dist/esm/workers/worker.protocol.js +2 -0
- package/dist/esm/workers/worker.protocol.js.map +1 -0
- package/dist/plugin.cjs +3179 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.js +3181 -0
- package/dist/plugin.js.map +1 -0
- package/dist/wasm/llama_engine.d.ts +74 -0
- package/dist/wasm/llama_engine.js +1829 -0
- package/dist/wasm/llama_engine.wasm +0 -0
- package/dist/wasm/llama_engine_emscripten.mjs +2 -0
- package/dist/wasm/package.json +16 -0
- package/dist/workers/llm.worker.js +1226 -0
- package/dist/workers/llm.worker.js.map +7 -0
- package/extraResources/llama-wasm/llama_engine.d.ts +74 -0
- package/extraResources/llama-wasm/llama_engine.js +1829 -0
- package/extraResources/llama-wasm/llama_engine.wasm +0 -0
- package/extraResources/llama-wasm/llama_engine_emscripten.mjs +2 -0
- package/extraResources/llama-wasm/package.json +16 -0
- package/extraResources/sidecar/README.md +11 -0
- package/extraResources/sidecar/darwin-arm64 +0 -0
- package/extraResources/sidecar/darwin-x64 +0 -0
- package/ios/CMakeLists-arm64.txt +161 -0
- package/ios/CMakeLists-x86_64.txt +188 -0
- package/ios/CMakeLists.txt +161 -0
- package/ios/Frameworks/llama-cpp.framework/Info.plist +28 -0
- package/ios/Frameworks/llama-cpp.framework/llama-cpp +0 -0
- package/ios/Sources/LlamaCppCapacitor/LlamaCpp.swift +1365 -0
- package/ios/Sources/LlamaCppCapacitor/LlamaCppPlugin.swift +694 -0
- package/ios/Sources/LlamaCppCapacitor/LlamaNativeBridge.swift +349 -0
- package/ios/Sources/LlamaCppCapacitor/ModelAdmissionController.swift +177 -0
- package/ios/embed-metal-shaders.sh +24 -0
- package/ios/metal-embed.cmake +29 -0
- package/package.json +281 -0
- package/scripts/build-js-preserve-wasm.cjs +53 -0
- package/scripts/build-sidecar-linux.sh +6 -0
- package/scripts/build-sidecar-win.bat +19 -0
- package/scripts/build-sidecar.sh +184 -0
- package/scripts/embed-llama-ios-app-framework.sh +63 -0
- package/scripts/ensure-desktop-sidecar-bundle.cjs +103 -0
- package/scripts/ensure-llama-ios-xcframework.sh +108 -0
- package/scripts/fix-esm-extensions.cjs +45 -0
- package/scripts/prepare-js-dist.cjs +28 -0
- package/scripts/stage-desktop-resources.cjs +116 -0
- package/sidecar/CMakeLists.txt +192 -0
- package/sidecar/cap-sidecar-main.cpp +68 -0
- package/types/llama-cpp-pro.d.ts +441 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// Multimodal Methods for Android JNI
|
|
2
|
+
|
|
3
|
+
JNIEXPORT jboolean JNICALL
|
|
4
|
+
Java_ai_annadata_plugin_capacitor_LlamaCpp_initMultimodalNative(
|
|
5
|
+
JNIEnv* env, jobject thiz, jlong contextId, jstring mmproj_path, jboolean use_gpu) {
|
|
6
|
+
|
|
7
|
+
try {
|
|
8
|
+
LOGI("Initializing multimodal for context ID: %ld", contextId);
|
|
9
|
+
|
|
10
|
+
std::string path = jni_utils::jstring_to_string(env, mmproj_path);
|
|
11
|
+
LOGI("Multimodal projection path: %s", path.c_str());
|
|
12
|
+
|
|
13
|
+
auto it = contexts.find(contextId);
|
|
14
|
+
if (it == contexts.end()) {
|
|
15
|
+
LOGE("Context not found: %ld", contextId);
|
|
16
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
|
|
17
|
+
return JNI_FALSE;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
auto& ctx = it->second;
|
|
21
|
+
if (!ctx || !ctx->ctx || !ctx->model) {
|
|
22
|
+
LOGE("Invalid context, llama context, or model is null");
|
|
23
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Invalid context or model not loaded");
|
|
24
|
+
return JNI_FALSE;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Check if model file exists
|
|
28
|
+
std::ifstream mmproj_file(path, std::ios::binary);
|
|
29
|
+
if (!mmproj_file.good()) {
|
|
30
|
+
LOGE("Multimodal projection file not found: %s", path.c_str());
|
|
31
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Multimodal projection file not found");
|
|
32
|
+
return JNI_FALSE;
|
|
33
|
+
}
|
|
34
|
+
mmproj_file.close();
|
|
35
|
+
|
|
36
|
+
// Initialize multimodal
|
|
37
|
+
bool result = ctx->initMultimodal(path, jni_utils::jboolean_to_bool(use_gpu));
|
|
38
|
+
|
|
39
|
+
if (!result) {
|
|
40
|
+
LOGE("Failed to initialize multimodal");
|
|
41
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Failed to initialize multimodal");
|
|
42
|
+
return JNI_FALSE;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
LOGI("Multimodal initialized successfully");
|
|
46
|
+
return JNI_TRUE;
|
|
47
|
+
|
|
48
|
+
} catch (const std::exception& e) {
|
|
49
|
+
LOGE("Exception in initMultimodal: %s", e.what());
|
|
50
|
+
throw_java_exception(env, "java/lang/RuntimeException", e.what());
|
|
51
|
+
return JNI_FALSE;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
JNIEXPORT jboolean JNICALL
|
|
56
|
+
Java_ai_annadata_plugin_capacitor_LlamaCpp_isMultimodalEnabledNative(
|
|
57
|
+
JNIEnv* env, jobject thiz, jlong contextId) {
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
auto it = contexts.find(contextId);
|
|
61
|
+
if (it == contexts.end()) {
|
|
62
|
+
LOGE("Context not found: %ld", contextId);
|
|
63
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
|
|
64
|
+
return JNI_FALSE;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
auto& ctx = it->second;
|
|
68
|
+
if (!ctx) {
|
|
69
|
+
LOGE("Invalid context");
|
|
70
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Invalid context");
|
|
71
|
+
return JNI_FALSE;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
bool enabled = ctx->isMultimodalEnabled();
|
|
75
|
+
LOGI("Multimodal enabled: %s", enabled ? "true" : "false");
|
|
76
|
+
return enabled ? JNI_TRUE : JNI_FALSE;
|
|
77
|
+
|
|
78
|
+
} catch (const std::exception& e) {
|
|
79
|
+
LOGE("Exception in isMultimodalEnabled: %s", e.what());
|
|
80
|
+
throw_java_exception(env, "java/lang/RuntimeException", e.what());
|
|
81
|
+
return JNI_FALSE;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
JNIEXPORT jobject JNICALL
|
|
86
|
+
Java_ai_annadata_plugin_capacitor_LlamaCpp_getMultimodalSupportNative(
|
|
87
|
+
JNIEnv* env, jobject thiz, jlong contextId) {
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
auto it = contexts.find(contextId);
|
|
91
|
+
if (it == contexts.end()) {
|
|
92
|
+
LOGE("Context not found: %ld", contextId);
|
|
93
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
|
|
94
|
+
return nullptr;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
auto& ctx = it->second;
|
|
98
|
+
if (!ctx) {
|
|
99
|
+
LOGE("Invalid context");
|
|
100
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Invalid context");
|
|
101
|
+
return nullptr;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Create result HashMap
|
|
105
|
+
jclass hashMapClass = env->FindClass("java/util/HashMap");
|
|
106
|
+
jmethodID hashMapConstructor = env->GetMethodID(hashMapClass, "<init>", "()V");
|
|
107
|
+
jmethodID putMethod = env->GetMethodID(hashMapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
|
108
|
+
|
|
109
|
+
jobject resultMap = env->NewObject(hashMapClass, hashMapConstructor);
|
|
110
|
+
|
|
111
|
+
bool supports_vision = ctx->isMultimodalSupportVision();
|
|
112
|
+
bool supports_audio = ctx->isMultimodalSupportAudio();
|
|
113
|
+
|
|
114
|
+
env->CallObjectMethod(resultMap, putMethod,
|
|
115
|
+
jni_utils::string_to_jstring(env, "vision"),
|
|
116
|
+
env->NewObject(env->FindClass("java/lang/Boolean"),
|
|
117
|
+
env->GetMethodID(env->FindClass("java/lang/Boolean"), "<init>", "(Z)V"),
|
|
118
|
+
supports_vision ? JNI_TRUE : JNI_FALSE));
|
|
119
|
+
|
|
120
|
+
env->CallObjectMethod(resultMap, putMethod,
|
|
121
|
+
jni_utils::string_to_jstring(env, "audio"),
|
|
122
|
+
env->NewObject(env->FindClass("java/lang/Boolean"),
|
|
123
|
+
env->GetMethodID(env->FindClass("java/lang/Boolean"), "<init>", "(Z)V"),
|
|
124
|
+
supports_audio ? JNI_TRUE : JNI_FALSE));
|
|
125
|
+
|
|
126
|
+
LOGI("Multimodal support - vision: %s, audio: %s",
|
|
127
|
+
supports_vision ? "true" : "false",
|
|
128
|
+
supports_audio ? "true" : "false");
|
|
129
|
+
|
|
130
|
+
return resultMap;
|
|
131
|
+
|
|
132
|
+
} catch (const std::exception& e) {
|
|
133
|
+
LOGE("Exception in getMultimodalSupport: %s", e.what());
|
|
134
|
+
throw_java_exception(env, "java/lang/RuntimeException", e.what());
|
|
135
|
+
return nullptr;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
JNIEXPORT void JNICALL
|
|
140
|
+
Java_ai_annadata_plugin_capacitor_LlamaCpp_releaseMultimodalNative(
|
|
141
|
+
JNIEnv* env, jobject thiz, jlong contextId) {
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
LOGI("Releasing multimodal for context ID: %ld", contextId);
|
|
145
|
+
|
|
146
|
+
auto it = contexts.find(contextId);
|
|
147
|
+
if (it == contexts.end()) {
|
|
148
|
+
LOGE("Context not found: %ld", contextId);
|
|
149
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
auto& ctx = it->second;
|
|
154
|
+
if (!ctx) {
|
|
155
|
+
LOGE("Invalid context");
|
|
156
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Invalid context");
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
ctx->releaseMultimodal();
|
|
161
|
+
LOGI("Multimodal released successfully");
|
|
162
|
+
|
|
163
|
+
} catch (const std::exception& e) {
|
|
164
|
+
LOGE("Exception in releaseMultimodal: %s", e.what());
|
|
165
|
+
throw_java_exception(env, "java/lang/RuntimeException", e.what());
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
// TTS/Vocoder Methods for Android JNI
|
|
2
|
+
|
|
3
|
+
JNIEXPORT jboolean JNICALL
|
|
4
|
+
Java_ai_annadata_plugin_capacitor_LlamaCpp_initVocoderNative(
|
|
5
|
+
JNIEnv* env, jobject thiz, jlong contextId, jstring vocoder_model_path, jint n_batch) {
|
|
6
|
+
|
|
7
|
+
try {
|
|
8
|
+
LOGI("Initializing vocoder for context ID: %ld", contextId);
|
|
9
|
+
|
|
10
|
+
std::string path = jni_utils::jstring_to_string(env, vocoder_model_path);
|
|
11
|
+
LOGI("Vocoder model path: %s", path.c_str());
|
|
12
|
+
|
|
13
|
+
auto it = contexts.find(contextId);
|
|
14
|
+
if (it == contexts.end()) {
|
|
15
|
+
LOGE("Context not found: %ld", contextId);
|
|
16
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
|
|
17
|
+
return JNI_FALSE;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
auto& ctx = it->second;
|
|
21
|
+
if (!ctx || !ctx->ctx || !ctx->model) {
|
|
22
|
+
LOGE("Invalid context, llama context, or model is null");
|
|
23
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Invalid context or model not loaded");
|
|
24
|
+
return JNI_FALSE;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Check if vocoder model file exists
|
|
28
|
+
std::ifstream vocoder_file(path, std::ios::binary);
|
|
29
|
+
if (!vocoder_file.good()) {
|
|
30
|
+
LOGE("Vocoder model file not found: %s", path.c_str());
|
|
31
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Vocoder model file not found");
|
|
32
|
+
return JNI_FALSE;
|
|
33
|
+
}
|
|
34
|
+
vocoder_file.close();
|
|
35
|
+
|
|
36
|
+
// Initialize vocoder with batch size (-1 means use default)
|
|
37
|
+
int batch_size = (n_batch > 0) ? static_cast<int>(n_batch) : -1;
|
|
38
|
+
bool result = ctx->initVocoder(path, batch_size);
|
|
39
|
+
|
|
40
|
+
if (!result) {
|
|
41
|
+
LOGE("Failed to initialize vocoder");
|
|
42
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Failed to initialize vocoder");
|
|
43
|
+
return JNI_FALSE;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
LOGI("Vocoder initialized successfully with batch size: %d", batch_size);
|
|
47
|
+
return JNI_TRUE;
|
|
48
|
+
|
|
49
|
+
} catch (const std::exception& e) {
|
|
50
|
+
LOGE("Exception in initVocoder: %s", e.what());
|
|
51
|
+
throw_java_exception(env, "java/lang/RuntimeException", e.what());
|
|
52
|
+
return JNI_FALSE;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
JNIEXPORT jboolean JNICALL
|
|
57
|
+
Java_ai_annadata_plugin_capacitor_LlamaCpp_isVocoderEnabledNative(
|
|
58
|
+
JNIEnv* env, jobject thiz, jlong contextId) {
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
auto it = contexts.find(contextId);
|
|
62
|
+
if (it == contexts.end()) {
|
|
63
|
+
LOGE("Context not found: %ld", contextId);
|
|
64
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
|
|
65
|
+
return JNI_FALSE;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
auto& ctx = it->second;
|
|
69
|
+
if (!ctx) {
|
|
70
|
+
LOGE("Invalid context");
|
|
71
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Invalid context");
|
|
72
|
+
return JNI_FALSE;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
bool enabled = ctx->isVocoderEnabled();
|
|
76
|
+
LOGI("Vocoder enabled: %s", enabled ? "true" : "false");
|
|
77
|
+
return enabled ? JNI_TRUE : JNI_FALSE;
|
|
78
|
+
|
|
79
|
+
} catch (const std::exception& e) {
|
|
80
|
+
LOGE("Exception in isVocoderEnabled: %s", e.what());
|
|
81
|
+
throw_java_exception(env, "java/lang/RuntimeException", e.what());
|
|
82
|
+
return JNI_FALSE;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
JNIEXPORT jobject JNICALL
|
|
87
|
+
Java_ai_annadata_plugin_capacitor_LlamaCpp_getFormattedAudioCompletionNative(
|
|
88
|
+
JNIEnv* env, jobject thiz, jlong contextId, jstring speaker_json_str, jstring text_to_speak) {
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
LOGI("Getting formatted audio completion for context ID: %ld", contextId);
|
|
92
|
+
|
|
93
|
+
auto it = contexts.find(contextId);
|
|
94
|
+
if (it == contexts.end()) {
|
|
95
|
+
LOGE("Context not found: %ld", contextId);
|
|
96
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
|
|
97
|
+
return nullptr;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
auto& ctx = it->second;
|
|
101
|
+
if (!ctx || !ctx->tts_wrapper) {
|
|
102
|
+
LOGE("Context or vocoder not initialized");
|
|
103
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Vocoder not initialized");
|
|
104
|
+
return nullptr;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
std::string speaker_json = jni_utils::jstring_to_string(env, speaker_json_str);
|
|
108
|
+
std::string text = jni_utils::jstring_to_string(env, text_to_speak);
|
|
109
|
+
|
|
110
|
+
LOGI("Text to synthesize: %s", text.c_str());
|
|
111
|
+
|
|
112
|
+
// Get formatted audio completion
|
|
113
|
+
capllama::llama_cap_audio_completion_result result =
|
|
114
|
+
ctx->tts_wrapper->getFormattedAudioCompletion(ctx.get(), speaker_json, text);
|
|
115
|
+
|
|
116
|
+
// Create result HashMap
|
|
117
|
+
jclass hashMapClass = env->FindClass("java/util/HashMap");
|
|
118
|
+
jmethodID hashMapConstructor = env->GetMethodID(hashMapClass, "<init>", "()V");
|
|
119
|
+
jmethodID putMethod = env->GetMethodID(hashMapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
|
120
|
+
|
|
121
|
+
jobject resultMap = env->NewObject(hashMapClass, hashMapConstructor);
|
|
122
|
+
|
|
123
|
+
env->CallObjectMethod(resultMap, putMethod,
|
|
124
|
+
jni_utils::string_to_jstring(env, "prompt"),
|
|
125
|
+
jni_utils::string_to_jstring(env, result.prompt));
|
|
126
|
+
|
|
127
|
+
if (result.grammar != nullptr) {
|
|
128
|
+
env->CallObjectMethod(resultMap, putMethod,
|
|
129
|
+
jni_utils::string_to_jstring(env, "grammar"),
|
|
130
|
+
jni_utils::string_to_jstring(env, result.grammar));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
LOGI("Audio completion formatted successfully");
|
|
134
|
+
return resultMap;
|
|
135
|
+
|
|
136
|
+
} catch (const std::exception& e) {
|
|
137
|
+
LOGE("Exception in getFormattedAudioCompletion: %s", e.what());
|
|
138
|
+
throw_java_exception(env, "java/lang/RuntimeException", e.what());
|
|
139
|
+
return nullptr;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
JNIEXPORT jobject JNICALL
|
|
144
|
+
Java_ai_annadata_plugin_capacitor_LlamaCpp_getAudioCompletionGuideTokensNative(
|
|
145
|
+
JNIEnv* env, jobject thiz, jlong contextId, jstring text_to_speak) {
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
LOGI("Getting audio completion guide tokens for context ID: %ld", contextId);
|
|
149
|
+
|
|
150
|
+
auto it = contexts.find(contextId);
|
|
151
|
+
if (it == contexts.end()) {
|
|
152
|
+
LOGE("Context not found: %ld", contextId);
|
|
153
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
|
|
154
|
+
return nullptr;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
auto& ctx = it->second;
|
|
158
|
+
if (!ctx || !ctx->tts_wrapper) {
|
|
159
|
+
LOGE("Context or vocoder not initialized");
|
|
160
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Vocoder not initialized");
|
|
161
|
+
return nullptr;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
std::string text = jni_utils::jstring_to_string(env, text_to_speak);
|
|
165
|
+
LOGI("Text for guide tokens: %s", text.c_str());
|
|
166
|
+
|
|
167
|
+
// Get guide tokens
|
|
168
|
+
std::vector<llama_token> guide_tokens =
|
|
169
|
+
ctx->tts_wrapper->getAudioCompletionGuideTokens(ctx.get(), text);
|
|
170
|
+
|
|
171
|
+
// Create Java ArrayList for tokens
|
|
172
|
+
jclass arrayListClass = env->FindClass("java/util/ArrayList");
|
|
173
|
+
jmethodID arrayListConstructor = env->GetMethodID(arrayListClass, "<init>", "()V");
|
|
174
|
+
jmethodID addMethod = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z");
|
|
175
|
+
|
|
176
|
+
jobject tokenList = env->NewObject(arrayListClass, arrayListConstructor);
|
|
177
|
+
|
|
178
|
+
// Add tokens
|
|
179
|
+
jclass integerClass = env->FindClass("java/lang/Integer");
|
|
180
|
+
jmethodID integerConstructor = env->GetMethodID(integerClass, "<init>", "(I)V");
|
|
181
|
+
|
|
182
|
+
for (llama_token token : guide_tokens) {
|
|
183
|
+
jobject jToken = env->NewObject(integerClass, integerConstructor, static_cast<jint>(token));
|
|
184
|
+
env->CallBooleanMethod(tokenList, addMethod, jToken);
|
|
185
|
+
env->DeleteLocalRef(jToken);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
LOGI("Retrieved %zu guide tokens", guide_tokens.size());
|
|
189
|
+
return tokenList;
|
|
190
|
+
|
|
191
|
+
} catch (const std::exception& e) {
|
|
192
|
+
LOGE("Exception in getAudioCompletionGuideTokens: %s", e.what());
|
|
193
|
+
throw_java_exception(env, "java/lang/RuntimeException", e.what());
|
|
194
|
+
return nullptr;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
JNIEXPORT jobject JNICALL
|
|
199
|
+
Java_ai_annadata_plugin_capacitor_LlamaCpp_decodeAudioTokensNative(
|
|
200
|
+
JNIEnv* env, jobject thiz, jlong contextId, jintArray tokens_array) {
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
LOGI("Decoding audio tokens for context ID: %ld", contextId);
|
|
204
|
+
|
|
205
|
+
auto it = contexts.find(contextId);
|
|
206
|
+
if (it == contexts.end()) {
|
|
207
|
+
LOGE("Context not found: %ld", contextId);
|
|
208
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
|
|
209
|
+
return nullptr;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
auto& ctx = it->second;
|
|
213
|
+
if (!ctx || !ctx->tts_wrapper) {
|
|
214
|
+
LOGE("Context or vocoder not initialized");
|
|
215
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Vocoder not initialized");
|
|
216
|
+
return nullptr;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Convert Java int array to C++ vector
|
|
220
|
+
jsize length = env->GetArrayLength(tokens_array);
|
|
221
|
+
jint* tokenArray = env->GetIntArrayElements(tokens_array, nullptr);
|
|
222
|
+
|
|
223
|
+
std::vector<llama_token> tokens;
|
|
224
|
+
for (jsize i = 0; i < length; i++) {
|
|
225
|
+
tokens.push_back(static_cast<llama_token>(tokenArray[i]));
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
env->ReleaseIntArrayElements(tokens_array, tokenArray, JNI_ABORT);
|
|
229
|
+
|
|
230
|
+
LOGI("Decoding %zu audio tokens", tokens.size());
|
|
231
|
+
|
|
232
|
+
// Decode audio tokens
|
|
233
|
+
std::vector<float> audio_samples = ctx->tts_wrapper->decodeAudioTokens(ctx.get(), tokens);
|
|
234
|
+
|
|
235
|
+
// Create Java ArrayList for audio samples
|
|
236
|
+
jclass arrayListClass = env->FindClass("java/util/ArrayList");
|
|
237
|
+
jmethodID arrayListConstructor = env->GetMethodID(arrayListClass, "<init>", "()V");
|
|
238
|
+
jmethodID addMethod = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z");
|
|
239
|
+
|
|
240
|
+
jobject audioList = env->NewObject(arrayListClass, arrayListConstructor);
|
|
241
|
+
|
|
242
|
+
// Add audio samples
|
|
243
|
+
jclass floatClass = env->FindClass("java/lang/Float");
|
|
244
|
+
jmethodID floatConstructor = env->GetMethodID(floatClass, "<init>", "(F)V");
|
|
245
|
+
|
|
246
|
+
for (float sample : audio_samples) {
|
|
247
|
+
jobject jSample = env->NewObject(floatClass, floatConstructor, sample);
|
|
248
|
+
env->CallBooleanMethod(audioList, addMethod, jSample);
|
|
249
|
+
env->DeleteLocalRef(jSample);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
LOGI("Decoded %zu audio samples", audio_samples.size());
|
|
253
|
+
return audioList;
|
|
254
|
+
|
|
255
|
+
} catch (const std::exception& e) {
|
|
256
|
+
LOGE("Exception in decodeAudioTokens: %s", e.what());
|
|
257
|
+
throw_java_exception(env, "java/lang/RuntimeException", e.what());
|
|
258
|
+
return nullptr;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
JNIEXPORT void JNICALL
|
|
263
|
+
Java_ai_annadata_plugin_capacitor_LlamaCpp_releaseVocoderNative(
|
|
264
|
+
JNIEnv* env, jobject thiz, jlong contextId) {
|
|
265
|
+
|
|
266
|
+
try {
|
|
267
|
+
LOGI("Releasing vocoder for context ID: %ld", contextId);
|
|
268
|
+
|
|
269
|
+
auto it = contexts.find(contextId);
|
|
270
|
+
if (it == contexts.end()) {
|
|
271
|
+
LOGE("Context not found: %ld", contextId);
|
|
272
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
auto& ctx = it->second;
|
|
277
|
+
if (!ctx) {
|
|
278
|
+
LOGE("Invalid context");
|
|
279
|
+
throw_java_exception(env, "java/lang/RuntimeException", "Invalid context");
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
ctx->releaseVocoder();
|
|
284
|
+
LOGI("Vocoder released successfully");
|
|
285
|
+
|
|
286
|
+
} catch (const std::exception& e) {
|
|
287
|
+
LOGE("Exception in releaseVocoder: %s", e.what());
|
|
288
|
+
throw_java_exception(env, "java/lang/RuntimeException", e.what());
|
|
289
|
+
}
|
|
290
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#ifndef JNI_UTILS_H
|
|
2
|
+
#define JNI_UTILS_H
|
|
3
|
+
|
|
4
|
+
#include <jni.h>
|
|
5
|
+
#include <string>
|
|
6
|
+
#include <vector>
|
|
7
|
+
#include "cap-llama.h"
|
|
8
|
+
|
|
9
|
+
namespace jni_utils {
|
|
10
|
+
|
|
11
|
+
// Convert Java string to C++ string
|
|
12
|
+
std::string jstring_to_string(JNIEnv* env, jstring jstr);
|
|
13
|
+
|
|
14
|
+
// Convert C++ string to Java string
|
|
15
|
+
jstring string_to_jstring(JNIEnv* env, const std::string& str);
|
|
16
|
+
|
|
17
|
+
// Convert Java string array to C++ string vector
|
|
18
|
+
std::vector<std::string> jstring_array_to_string_vector(JNIEnv* env, jobjectArray jarray);
|
|
19
|
+
|
|
20
|
+
// Convert C++ string vector to Java string array
|
|
21
|
+
jobjectArray string_vector_to_jstring_array(JNIEnv* env, const std::vector<std::string>& vec);
|
|
22
|
+
|
|
23
|
+
// Convert Java boolean to C++ bool
|
|
24
|
+
bool jboolean_to_bool(jboolean jbool);
|
|
25
|
+
|
|
26
|
+
// Convert C++ bool to Java boolean
|
|
27
|
+
jboolean bool_to_jboolean(bool b);
|
|
28
|
+
|
|
29
|
+
// Convert Java int to C++ int
|
|
30
|
+
int jint_to_int(jint jint_val);
|
|
31
|
+
|
|
32
|
+
// Convert C++ int to Java int
|
|
33
|
+
jint int_to_jint(int val);
|
|
34
|
+
|
|
35
|
+
// Convert Java float to C++ float
|
|
36
|
+
float jfloat_to_float(jfloat jfloat_val);
|
|
37
|
+
|
|
38
|
+
// Convert C++ float to Java float
|
|
39
|
+
jfloat float_to_jfloat(float val);
|
|
40
|
+
|
|
41
|
+
// Convert Java long to C++ long
|
|
42
|
+
long jlong_to_long(jlong jlong_val);
|
|
43
|
+
|
|
44
|
+
// Convert C++ long to Java long
|
|
45
|
+
jlong long_to_jlong(long val);
|
|
46
|
+
|
|
47
|
+
// Convert Java double to C++ double
|
|
48
|
+
double jdouble_to_double(jdouble jdouble_val);
|
|
49
|
+
|
|
50
|
+
// Convert C++ double to Java double
|
|
51
|
+
jdouble double_to_jdouble(double val);
|
|
52
|
+
|
|
53
|
+
// Throw Java exception
|
|
54
|
+
void throw_java_exception(JNIEnv* env, const char* class_name, const char* message);
|
|
55
|
+
|
|
56
|
+
// Check if exception occurred
|
|
57
|
+
bool check_exception(JNIEnv* env);
|
|
58
|
+
|
|
59
|
+
/** Capacitor 8+ JSObject has no getDouble(); read via inherited JSONObject.optDouble. */
|
|
60
|
+
double jsobject_opt_double(JNIEnv* env, jobject jso, const char* key, double default_value);
|
|
61
|
+
|
|
62
|
+
/** Capacitor 8+ JSObject has no getBoolean(String); read via inherited JSONObject.optBoolean. */
|
|
63
|
+
bool jsobject_opt_bool(JNIEnv* env, jobject jso, const char* key, bool default_value);
|
|
64
|
+
|
|
65
|
+
/** Read optional string via inherited JSONObject.optString. */
|
|
66
|
+
std::string jsobject_opt_string(JNIEnv* env, jobject jso, const char* key, const std::string& default_value);
|
|
67
|
+
|
|
68
|
+
// Get field ID safely
|
|
69
|
+
jfieldID get_field_id(JNIEnv* env, jclass clazz, const char* name, const char* sig);
|
|
70
|
+
|
|
71
|
+
// Get method ID safely
|
|
72
|
+
jmethodID get_method_id(JNIEnv* env, jclass clazz, const char* name, const char* sig);
|
|
73
|
+
|
|
74
|
+
// Find class safely
|
|
75
|
+
jclass find_class(JNIEnv* env, const char* name);
|
|
76
|
+
|
|
77
|
+
// Create object safely
|
|
78
|
+
jobject create_object(JNIEnv* env, jclass clazz, jmethodID constructor, ...);
|
|
79
|
+
|
|
80
|
+
// Call method safely
|
|
81
|
+
jobject call_method(JNIEnv* env, jobject obj, jmethodID method, ...);
|
|
82
|
+
|
|
83
|
+
// Call static method safely
|
|
84
|
+
jobject call_static_method(JNIEnv* env, jclass clazz, jmethodID method, ...);
|
|
85
|
+
|
|
86
|
+
// Set field safely
|
|
87
|
+
void set_field(JNIEnv* env, jobject obj, jfieldID field, ...);
|
|
88
|
+
|
|
89
|
+
// Get field safely
|
|
90
|
+
jobject get_field(JNIEnv* env, jobject obj, jfieldID field);
|
|
91
|
+
|
|
92
|
+
// Set static field safely
|
|
93
|
+
void set_static_field(JNIEnv* env, jclass clazz, jfieldID field, ...);
|
|
94
|
+
|
|
95
|
+
// Get static field safely
|
|
96
|
+
jobject get_static_field(JNIEnv* env, jclass clazz, jfieldID field);
|
|
97
|
+
|
|
98
|
+
// Convert llama_cap_context to jobject
|
|
99
|
+
jobject llama_context_to_jobject(JNIEnv* env, const capllama::llama_cap_context* context);
|
|
100
|
+
|
|
101
|
+
// Convert jobject to llama_cap_context
|
|
102
|
+
capllama::llama_cap_context* jobject_to_llama_context(JNIEnv* env, jobject obj);
|
|
103
|
+
|
|
104
|
+
// Convert completion result to jobject
|
|
105
|
+
jobject completion_result_to_jobject(JNIEnv* env, const capllama::completion_token_output& result);
|
|
106
|
+
|
|
107
|
+
// Convert jobject to completion parameters
|
|
108
|
+
common_params jobject_to_completion_params(JNIEnv* env, jobject obj);
|
|
109
|
+
|
|
110
|
+
// Convert chat parameters to jobject
|
|
111
|
+
jobject chat_params_to_jobject(JNIEnv* env, const common_chat_params& params);
|
|
112
|
+
|
|
113
|
+
// Convert jobject to chat parameters
|
|
114
|
+
common_chat_params jobject_to_chat_params(JNIEnv* env, jobject obj);
|
|
115
|
+
|
|
116
|
+
// Convert tokenize result to jobject
|
|
117
|
+
jobject tokenize_result_to_jobject(JNIEnv* env, const capllama::llama_cap_tokenize_result& result);
|
|
118
|
+
|
|
119
|
+
// Convert embedding result to jobject
|
|
120
|
+
jobject embedding_result_to_jobject(JNIEnv* env, const std::vector<float>& embedding);
|
|
121
|
+
|
|
122
|
+
// Convert rerank result to jobject
|
|
123
|
+
jobject rerank_result_to_jobject(JNIEnv* env, const std::vector<std::pair<size_t, float>>& results);
|
|
124
|
+
|
|
125
|
+
// Convert benchmark result to jobject
|
|
126
|
+
jobject benchmark_result_to_jobject(JNIEnv* env, const std::vector<float>& timings);
|
|
127
|
+
|
|
128
|
+
// Convert LoRA adapter info to jobject
|
|
129
|
+
jobject lora_adapter_info_to_jobject(JNIEnv* env, const common_adapter_lora_info& info);
|
|
130
|
+
|
|
131
|
+
// Convert jobject to LoRA adapter info
|
|
132
|
+
common_adapter_lora_info jobject_to_lora_adapter_info(JNIEnv* env, jobject obj);
|
|
133
|
+
|
|
134
|
+
// Convert multimodal support info to jobject
|
|
135
|
+
jobject multimodal_support_to_jobject(JNIEnv* env, bool vision, bool audio);
|
|
136
|
+
|
|
137
|
+
// Convert TTS result to jobject
|
|
138
|
+
jobject tts_result_to_jobject(JNIEnv* env, const std::vector<float>& audio_data, int sample_rate);
|
|
139
|
+
|
|
140
|
+
// Convert session data to jobject
|
|
141
|
+
jobject session_data_to_jobject(JNIEnv* env, const std::string& data);
|
|
142
|
+
|
|
143
|
+
// Convert jobject to session data
|
|
144
|
+
std::string jobject_to_session_data(JNIEnv* env, jobject obj);
|
|
145
|
+
|
|
146
|
+
} // namespace jni_utils
|
|
147
|
+
|
|
148
|
+
#endif // JNI_UTILS_H
|