Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions common/liboceanbase_jni_common/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
cmake_minimum_required(VERSION 3.10)
project(oceanbase_jni_common LANGUAGES CXX)

# Find JNI
FIND_PACKAGE(JNI REQUIRED COMPONENTS JVM)

# Add library
ADD_LIBRARY(${PROJECT_NAME} SHARED jni_manager.cpp)

# Include directories
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:.>
${JNI_INCLUDE_DIRS}
)

# Link JNI
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE ${JNI_LIBRARIES})

# Set C++ standard
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES
CXX_STANDARD 11
CXX_STANDARD_REQUIRED ON
CXX_VISIBILITY_PRESET default
)

# Install
install(FILES jni_manager.h DESTINATION include)
install(TARGETS ${PROJECT_NAME}
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
)

105 changes: 105 additions & 0 deletions common/liboceanbase_jni_common/README.en-US.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# OceanBase JNI Common Management Library

A common JNI management library for OceanBase multi-language tokenization plugins, providing unified JVM management and thread-safe JNI environment.

## Features

- ✅ Singleton JVM Management: Multiple plugins share the same JVM instance
- ✅ Thread Safety: Automatic JNI thread attach/detach handling
- ✅ Reference Counting: Smart JNI environment lifecycle management
- ✅ RAII Pattern: Automatic resource management, prevents memory leaks

## Core Components

### GlobalJVMManager
```cpp
// Global singleton JVM manager
GlobalJVMManager& jvm_manager = GlobalJVMManager::getInstance();
JavaVM* jvm = jvm_manager.getJVM();
```

### GlobalThreadManager
```cpp
// Thread-safe JNI environment management
GlobalThreadManager& thread_manager = GlobalThreadManager::getInstance();
JNIEnv* env = thread_manager.attachCurrentThread();
thread_manager.detachCurrentThread();
```

### ScopedJNIEnvironment
```cpp
// RAII automatic JNI environment management
{
ScopedJNIEnvironment scoped_env;
JNIEnv* env = scoped_env.getEnv();
// Automatically cleaned up when scope ends
}
```

## Use Cases

### Multi-Plugin Coexistence
- **Japanese Parser Plugin** (`libjapanese_ftparser.so`)
- **Korean Parser Plugin** (`libkorean_ftparser.so`)
- **Thai Parser Plugin** (`libthai_ftparser.so`)

All plugins share the same JVM instance, avoiding conflicts.

### Thread Safety
Automatically handles JNI calls in multi-threaded environments:
```cpp
// Thread A
ScopedJNIEnvironment env_a; // Auto attach
// Use env_a.getEnv()

// Thread B
ScopedJNIEnvironment env_b; // Auto attach
// Use env_b.getEnv()
// Threads don't interfere with each other
```

## Build

```bash
cd common/liboceanbase_jni_common
mkdir build && cd build
cmake ..
make
```

Generates `liboceanbase_jni_common.so` shared library.

## Deployment

```bash
# Copy to Observer plugin directory
cp liboceanbase_jni_common.so /path/to/observer/plugin_dir/

# Ensure all tokenization plugins can find this library
export LD_LIBRARY_PATH=/path/to/observer/plugin_dir:$LD_LIBRARY_PATH
```

## Technical Advantages

### Core Problems Solved
1. **JVM Conflicts**: Conflicts caused by multiple plugins trying to create JVM
2. **Memory Leaks**: Improper JNI environment release
3. **Thread Safety**: JNI call issues in multi-threaded environments
4. **Resource Management**: Complex JNI lifecycle management

### Design Patterns
- **Singleton Pattern**: Ensures globally unique JVM
- **RAII Pattern**: Automatic resource management
- **Reference Counting**: Smart pointer-style environment management
- **Thread Local Storage**: Per-thread independent JNI environment

## Dependencies

```
liboceanbase_jni_common.so
├── libjapanese_ftparser.so
├── libkorean_ftparser.so
└── libthai_ftparser.so
```

**Providing stable and reliable JNI infrastructure for OceanBase multi-language fulltext search**
105 changes: 105 additions & 0 deletions common/liboceanbase_jni_common/README.zh-CN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# OceanBase JNI 公共管理库

OceanBase 多语言分词插件的公共 JNI 管理库,提供统一的 JVM 管理和线程安全的 JNI 环境。

## 功能特性

- ✅ 单例 JVM 管理:多个插件共享同一个 JVM 实例
- ✅ 线程安全:自动处理 JNI 线程附加/分离
- ✅ 引用计数:智能管理 JNI 环境的生命周期
- ✅ RAII 模式:自动资源管理,防止内存泄漏

## 核心组件

### GlobalJVMManager
```cpp
// 全局单例 JVM 管理器
GlobalJVMManager& jvm_manager = GlobalJVMManager::getInstance();
JavaVM* jvm = jvm_manager.getJVM();
```

### GlobalThreadManager
```cpp
// 线程安全的 JNI 环境管理
GlobalThreadManager& thread_manager = GlobalThreadManager::getInstance();
JNIEnv* env = thread_manager.attachCurrentThread();
thread_manager.detachCurrentThread();
```

### ScopedJNIEnvironment
```cpp
// RAII 自动管理 JNI 环境
{
ScopedJNIEnvironment scoped_env;
JNIEnv* env = scoped_env.getEnv();
// 自动在作用域结束时清理
}
```

## 使用场景

### 多插件共存
- **日语分词插件** (`libjapanese_ftparser.so`)
- **韩语分词插件** (`libkorean_ftparser.so`)
- **泰语分词插件** (`libthai_ftparser.so`)

所有插件共享同一个 JVM 实例,避免冲突。

### 线程安全
自动处理多线程环境下的 JNI 调用:
```cpp
// 线程 A
ScopedJNIEnvironment env_a; // 自动附加
// 使用 env_a.getEnv()

// 线程 B
ScopedJNIEnvironment env_b; // 自动附加
// 使用 env_b.getEnv()
// 两个线程互不干扰
```

## 编译

```bash
cd common/liboceanbase_jni_common
mkdir build && cd build
cmake ..
make
```

生成 `liboceanbase_jni_common.so` 共享库。

## 部署

```bash
# 复制到 Observer 插件目录
cp liboceanbase_jni_common.so /path/to/observer/plugin_dir/

# 确保所有分词插件都能找到此库
export LD_LIBRARY_PATH=/path/to/observer/plugin_dir:$LD_LIBRARY_PATH
```

## 技术优势

### 解决的核心问题
1. **JVM 冲突**:多个插件试图创建 JVM 导致的冲突
2. **内存泄漏**:JNI 环境未正确释放
3. **线程安全**:多线程环境下的 JNI 调用问题
4. **资源管理**:复杂的 JNI 生命周期管理

### 设计模式
- **单例模式**:确保 JVM 全局唯一
- **RAII 模式**:自动资源管理
- **引用计数**:智能指针式的环境管理
- **线程局部存储**:每线程独立的 JNI 环境

## 依赖关系

```
liboceanbase_jni_common.so
├── libjapanese_ftparser.so
├── libkorean_ftparser.so
└── libthai_ftparser.so
```

**为 OceanBase 多语言全文检索提供稳定可靠的 JNI 基础设施**
Loading