From d3d26ba9b44b86be52076361443f930e2c260871 Mon Sep 17 00:00:00 2001 From: huangping Date: Mon, 25 May 2026 15:02:12 +0800 Subject: [PATCH] feat(sdk): add JNI bridge between Java NativeBridge and Rust C ABI --- .../auth/bitanswer/BitAnswerProvider.java | 2 +- native/craft-core/build.rs | 1 - native/craft-core/jni_bridge.c | 45 +++++++++++++++++++ native/craft-core/src/lib.rs | 1 - 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 native/craft-core/jni_bridge.c diff --git a/java/craftlabs-auth-bitanswer/src/main/java/cn/craftlabs/auth/bitanswer/BitAnswerProvider.java b/java/craftlabs-auth-bitanswer/src/main/java/cn/craftlabs/auth/bitanswer/BitAnswerProvider.java index dc007e0..7e08b6e 100644 --- a/java/craftlabs-auth-bitanswer/src/main/java/cn/craftlabs/auth/bitanswer/BitAnswerProvider.java +++ b/java/craftlabs-auth-bitanswer/src/main/java/cn/craftlabs/auth/bitanswer/BitAnswerProvider.java @@ -18,7 +18,7 @@ import cn.craftlabs.auth.internal.NativeBridge; */ public final class BitAnswerProvider implements AuthProvider { static { - System.loadLibrary("craftlabs_auth_bitanswer"); + System.loadLibrary("craftlabs_auth_core"); } private long nativeHandle; diff --git a/native/craft-core/build.rs b/native/craft-core/build.rs index d150961..c0a01d1 100644 --- a/native/craft-core/build.rs +++ b/native/craft-core/build.rs @@ -16,7 +16,6 @@ fn main() { let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); fs::write(out_dir.join("build_hash.txt"), format!("{}\n", hash_hex)).unwrap(); - // 嵌入 RSA 公钥(用于 selfhosted 验签) let pubkey_path = PathBuf::from(&manifest_dir).join("embedded").join("pubkey.pem"); if let Ok(pubkey) = fs::read_to_string(&pubkey_path) { let trimmed = pubkey.trim(); diff --git a/native/craft-core/jni_bridge.c b/native/craft-core/jni_bridge.c new file mode 100644 index 0000000..c137429 --- /dev/null +++ b/native/craft-core/jni_bridge.c @@ -0,0 +1,45 @@ +/* JNI bridge — connects Java NativeBridge to Rust C ABI + * Compile: gcc -shared -fPIC -I$JAVA_HOME/include -I$JAVA_HOME/include/darwin + * -I native/include -o libcraftlabs_jni_bridge.so jni_bridge.c -L. -lcraftlabs_auth_core + * + * Then: java -Djava.library.path=. ... loads both libraries. + * Or rename the output to craftlabs_auth_core and load it directly. + */ +#include +#include "craftlabs_auth.h" + +JNIEXPORT jlong JNICALL Java_cn_craftlabs_auth_internal_NativeBridge_nativeInitialize( + JNIEnv *env, jclass clazz, jstring configJson) { + const char *utf = (*env)->GetStringUTFChars(env, configJson, NULL); + jlong handle = (jlong)(intptr_t)craft_initialize(utf); + (*env)->ReleaseStringUTFChars(env, configJson, utf); + return handle; +} + +JNIEXPORT void JNICALL Java_cn_craftlabs_auth_internal_NativeBridge_nativeDestroy( + JNIEnv *env, jclass clazz, jlong handle) { + (void)env; (void)clazz; + if (handle) craft_destroy((AuthHandle)(intptr_t)handle); +} + +JNIEXPORT jobject JNICALL Java_cn_craftlabs_auth_internal_NativeBridge_nativeActivate( + JNIEnv *env, jclass clazz, jlong handle, jstring licenseKey) { + (void)clazz; + const char *key = (*env)->GetStringUTFChars(env, licenseKey, NULL); + AuthResult r = craft_activate((AuthHandle)(intptr_t)handle, key); + (*env)->ReleaseStringUTFChars(env, licenseKey, key); + jclass cls = (*env)->FindClass(env, "cn/craftlabs/auth/AuthResult"); + jmethodID ctor = (*env)->GetMethodID(env, cls, "", "(ZLjava/lang/String;)V"); + jstring msg = (*env)->NewStringUTF(env, r.message ? r.message : ""); + return (*env)->NewObject(env, cls, ctor, r.success ? JNI_TRUE : JNI_FALSE, msg); +} + +JNIEXPORT jobject JNICALL Java_cn_craftlabs_auth_internal_NativeBridge_nativeCheckLicense( + JNIEnv *env, jclass clazz, jlong handle) { + (void)clazz; + AuthResult r = craft_check_license((AuthHandle)(intptr_t)handle); + jclass cls = (*env)->FindClass(env, "cn/craftlabs/auth/AuthResult"); + jmethodID ctor = (*env)->GetMethodID(env, cls, "", "(ZLjava/lang/String;)V"); + jstring msg = (*env)->NewStringUTF(env, r.message ? r.message : ""); + return (*env)->NewObject(env, cls, ctor, r.success ? JNI_TRUE : JNI_FALSE, msg); +} diff --git a/native/craft-core/src/lib.rs b/native/craft-core/src/lib.rs index e383074..6fcc7e6 100644 --- a/native/craft-core/src/lib.rs +++ b/native/craft-core/src/lib.rs @@ -9,7 +9,6 @@ mod session; pub mod crypto; pub mod device; pub mod provider_selfhosted; - use trait_provider::{Provider, ActivateResponse, HeartbeatResponse, LicenseStatus}; use provider_selfhosted::SelfHostedProvider;