How To

Menggunakan C FFI

Panduan integrasi C / C++ dan Foreign Function Interface (FFI) untuk RustO!.

RustO! mengekspor C ABI yang stabil melalui pustaka bersama dinamis (librusto.so, librusto.dylib, rusto.dll) serta arsip statis (librusto.a, rusto.lib).

Header C (rusto.h)

#ifndef RUSTO_H
#define RUSTO_H

#include <stdint.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

// Handle instance mesin buram (opaque)
typedef struct ROCRHandle ROCRHandle;

// Blok hasil deteksi teks yang kompatibel dengan C
typedef struct {
    char *text;
    float score;
    float box_x1, box_y1;
    float box_x2, box_y2;
    float box_x3, box_y3;
    float box_x4, box_y4;
    float frame_width, frame_height;
    float frame_top, frame_left;
} CTextResult;

// 1. Siklus Hidup Mesin
ROCRHandle *rocr_initialize(const char *config_json);
void rocr_free(ROCRHandle *handle);
const char *rocr_version(void);

// 2. Deteksi Teks Terstruktur (Baris / Kata)
int rocr_detect_text_file(
    ROCRHandle *handle,
    const char *image_path,
    const char *options_json,
    CTextResult **results_out,
    size_t *count_out
);

int rocr_detect_text_data(
    ROCRHandle *handle,
    const uint8_t *image_data,
    size_t image_len,
    const char *options_json,
    CTextResult **results_out,
    size_t *count_out
);

// 3. Deteksi Tata Letak Spasial
char *rocr_detect_text_file_spatial(
    ROCRHandle *handle,
    const char *image_path,
    const char *options_json
);

char *rocr_detect_text_data_spatial(
    ROCRHandle *handle,
    const uint8_t *image_data,
    size_t image_len,
    const char *options_json
);

// 4. Dealokasi Memori
void rocr_free_results(CTextResult *results, size_t count);
void rocr_free_string(char *s);

#ifdef __cplusplus
}
#endif

#endif // RUSTO_H

Referensi Kode Status (Return Codes)

Fungsi dengan status pengembalian int menggunakan kode kesalahan berikut:

KodeKonstantaMakna
0ROCR_OKOperasi berhasil.
-1ROCR_ERR_NULL_PTRPointer null diteruskan pada argumen yang wajib diisi.
-2ROCR_ERR_INVALID_PATHPath berkas tidak valid atau tidak ditemukan.
-3ROCR_ERR_ENGINEKesalahan internal mesin inferensi atau deteksi OCR.
-4ROCR_ERR_INVALID_OPTIONSKesalahan sintaks atau validasi JSON opsi.
-5ROCR_ERR_MODE_MISMATCHMode opsi output tidak cocok dengan fungsi C yang dipanggil.

Contoh Aplikasi C

#include <stdio.h>
#include <stdlib.h>
#include "rusto.h"

int main() {
    printf("Versi RustO!: %s\n", rocr_version());

    // 1. Inisialisasi mesin dengan konfigurasi JSON
    const char *init_json =
        "{"
        "  \"template\": \"ppv6\","
        "  \"detection\": { \"modelPath\": \"models/det.rten\" },"
        "  \"recognition\": { \"modelPath\": \"models/rec.rten\", \"dictPath\": \"models/dict.txt\" }"
        "}";

    ROCRHandle *engine = rocr_initialize(init_json);
    if (!engine) {
        fprintf(stderr, "Gagal menginisialisasi mesin RustO!.\n");
        return 1;
    }

    // 2. Jalankan deteksi teks terstruktur
    const char *options_json = "{\"output\":\"lines\",\"textScore\":0.5}";
    CTextResult *results = NULL;
    size_t count = 0;

    int status = rocr_detect_text_file(engine, "receipt.jpg", options_json, &results, &count);
    if (status == 0) {
        printf("Ditemukan %zu blok teks:\n", count);
        for (size_t i = 0; i < count; i++) {
            printf("[%zu] %s (Skor: %.2f) di (%.1f, %.1f) [%.1fx%.1f]\n",
                i, results[i].text, results[i].score,
                results[i].frame_left, results[i].frame_top,
                results[i].frame_width, results[i].frame_height
            );
        }
        // Selalu bebaskan hasil terstruktur
        rocr_free_results(results, count);
    } else {
        fprintf(stderr, "Kode kesalahan OCR: %d\n", status);
    }

    // 3. Jalankan rekonstruksi tata letak spasial
    const char *spatial_opts = "{\"output\":\"spatial\",\"lineYThreshold\":0.5,\"wordXThreshold\":0.4}";
    char *spatial_text = rocr_detect_text_file_spatial(engine, "receipt.jpg", spatial_opts);
    if (spatial_text) {
        printf("\n--- Tata Letak Spasial ---\n%s\n", spatial_text);
        // Selalu bebaskan alokasi string spasial
        rocr_free_string(spatial_text);
    }

    // 4. Dealokasi instans mesin
    rocr_free(engine);
    return 0;
}

Kompilasi dan Penautan (Linking)

Menggunakan GCC / Clang

gcc main.c -I. -L. -lrusto -Wl,-rpath,. -o ocr_demo
./ocr_demo

Menggunakan CMake (CMakeLists.txt)

cmake_minimum_required(VERSION 3.15)
project(OcrApp C)

add_executable(ocr_app main.c)

# Sertakan direktori header
target_include_directories(ocr_app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

# Tautkan pustaka bersama librusto
target_link_libraries(ocr_app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/librusto.so)