From 47961709add68a60835bd9ff79bddf30e1895fc6 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 19 Jul 2024 13:13:34 +0400 Subject: [PATCH 01/26] Fix docbuilder.c `ToString` function --- .../doctrenderer/docbuilder.python/src/docbuilder_functions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp index 24bb38523f..6df39de00e 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp @@ -95,7 +95,7 @@ const wchar_t* CDocBuilderValue_ToString(CDocBuilderValue* self) CString strValue = self->ToString(); size_t len = wcslen(strValue.c_str()); wchar_t* strRes = new wchar_t[len + 1]; - memcpy(strRes, strValue.c_str(), (len + 1) + sizeof(wchar_t)); + memcpy(strRes, strValue.c_str(), (len + 1) * sizeof(wchar_t)); return strRes; } From 46f30b980ffa5fe836c837e9346cc62a0f805a56 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 19 Jul 2024 20:35:42 +0400 Subject: [PATCH 02/26] Add JNI code for `CDocBuilderValue` --- .../doctrenderer/docbuilder.java/.gitignore | 3 + .../src/java/docbuilder/CDocBuilderValue.java | 52 +++ .../src/jni/docbuilder_CDocBuilderValue.cpp | 273 ++++++++++++++++ .../src/jni/docbuilder_CDocBuilderValue.h | 301 ++++++++++++++++++ .../src/jni/docbuilder_jni.pro | 38 +++ 5 files changed, 667 insertions(+) create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/.gitignore create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro diff --git a/DesktopEditor/doctrenderer/docbuilder.java/.gitignore b/DesktopEditor/doctrenderer/docbuilder.java/.gitignore new file mode 100644 index 0000000000..f51d072bd6 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/.gitignore @@ -0,0 +1,3 @@ +result.docx +*.class +*.jar diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java new file mode 100644 index 0000000000..01153d0319 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java @@ -0,0 +1,52 @@ +package docbuilder; + +public class CDocBuilderValue { + private long c_internal = 0; + + // NATIVE METHODS: + private native long c_Create(); + private native long c_Copy(long other); + private native void c_Destroy(long self); + + private native boolean c_IsEmpty(long self); + private native void c_Clear(long self); + + private native boolean c_IsNull(long self); + private native boolean c_IsUndefined(long self); + private native boolean c_IsInt(long self); + private native boolean c_IsDouble(long self); + private native boolean c_IsString(long self); + private native boolean c_IsFunction(long self); + private native boolean c_IsObject(long self); + private native boolean c_IsArray(long self); + + private native int c_GetLength(long self); + + private native boolean c_ToBool(long self); + private native int c_ToInt(long self); + private native double c_ToDouble(long self); + private native String c_ToString(long self); + + private native long c_GetProperty(long self, String name); + private native long c_GetByIndex(long self, int index); + + private native void c_SetProperty(long self, String name, long value); + private native void c_SetByIndex(long self, int index, long value); + + private native long c_CreateWithBool(boolean value); + private native long c_CreateWithInt(int value); + private native long c_CreateWithDouble(double value); + private native long c_CreateWithString(String value); + + private native long c_CreateUndefined(); + private native long c_CreateNull(); + private native long c_CreateArray(int length); + + private native long c_Call0(long self, String name); + private native long c_Call1(long self, String name, long p1); + private native long c_Call2(long self, String name, long p1, long p2); + private native long c_Call3(long self, String name, long p1, long p2, long p3); + private native long c_Call4(long self, String name, long p1, long p2, long p3, long p4); + private native long c_Call5(long self, String name, long p1, long p2, long p3, long p4, long p5); + private native long c_Call6(long self, String name, long p1, long p2, long p3, long p4, long p5, long p6); +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp new file mode 100644 index 0000000000..b969266ae2 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp @@ -0,0 +1,273 @@ +#include "docbuilder_CDocBuilderValue.h" + +#include + +#include "docbuilder.h" +// for wchar_t <=> char conversion +#include "../../../../common/File.h" + +using namespace NSDoctRenderer; + +jlong Java_docbuilder_CDocBuilderValue_c_1Create(JNIEnv* env, jobject obj) +{ + return reinterpret_cast(new CDocBuilderValue()); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1Copy(JNIEnv* env, jobject obj, jlong other) +{ + CDocBuilderValue* pOther = reinterpret_cast(other); + return reinterpret_cast(new CDocBuilderValue(*pOther)); +} + +void Java_docbuilder_CDocBuilderValue_c_1Destroy(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + delete pSelf; +} + +jboolean Java_docbuilder_CDocBuilderValue_c_1IsEmpty(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsEmpty(); +} + +void Java_docbuilder_CDocBuilderValue_c_1Clear(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + pSelf->Clear(); +} + +jboolean Java_docbuilder_CDocBuilderValue_c_1IsNull(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsNull(); +} + +jboolean Java_docbuilder_CDocBuilderValue_c_1IsUndefined(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsUndefined(); +} + +jboolean Java_docbuilder_CDocBuilderValue_c_1IsInt(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsInt(); +} + +jboolean Java_docbuilder_CDocBuilderValue_c_1IsDouble(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsDouble(); +} + +jboolean Java_docbuilder_CDocBuilderValue_c_1IsString(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsString(); +} + +jboolean Java_docbuilder_CDocBuilderValue_c_1IsFunction(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsFunction(); +} + +jboolean Java_docbuilder_CDocBuilderValue_c_1IsObject(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsObject(); +} + +jboolean Java_docbuilder_CDocBuilderValue_c_1IsArray(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsArray(); +} + +jint Java_docbuilder_CDocBuilderValue_c_1GetLength(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jint)pSelf->GetLength(); +} + +jboolean Java_docbuilder_CDocBuilderValue_c_1ToBool(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->ToBool(); +} + +jint Java_docbuilder_CDocBuilderValue_c_1ToInt(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jint)pSelf->ToInt(); +} + +jdouble Java_docbuilder_CDocBuilderValue_c_1ToDouble(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jdouble)pSelf->ToDouble(); +} + +jstring Java_docbuilder_CDocBuilderValue_c_1ToString(JNIEnv* env, jobject obj, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + CString strValue = pSelf->ToString(); + std::string strUtfData = NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(strValue.c_str(), (LONG)wcslen(strValue.c_str())); + return env->NewStringUTF(strUtfData.c_str()); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1GetProperty(JNIEnv* env, jobject obj, jlong self, jstring name) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + const char* strUtfName = env->GetStringUTFChars(name, nullptr); + CDocBuilderValue* pValue = new CDocBuilderValue(pSelf->Get(strUtfName)); + env->ReleaseStringUTFChars(name, strUtfName); + return reinterpret_cast(pValue); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1GetByIndex(JNIEnv* env, jobject obj, jlong self, jint index) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + CDocBuilderValue* pValue = new CDocBuilderValue(pSelf->Get((int)index)); + return reinterpret_cast(pValue); +} + +void Java_docbuilder_CDocBuilderValue_c_1SetProperty(JNIEnv* env, jobject obj, jlong self, jstring name, jlong value) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + CDocBuilderValue* pValue = reinterpret_cast(value); + const char* strUtfName = env->GetStringUTFChars(name, nullptr); + std::wstring strName = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)strUtfName, (LONG)strlen(strUtfName)); + pSelf->Set(strName.c_str(), *pValue); + env->ReleaseStringUTFChars(name, strUtfName); +} + +void Java_docbuilder_CDocBuilderValue_c_1SetByIndex(JNIEnv* env, jobject obj, jlong self, jint index, jlong value) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + CDocBuilderValue* pValue = reinterpret_cast(value); + pSelf->Set((int)index, pValue); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithBool(JNIEnv* env, jobject obj, jboolean value) +{ + return reinterpret_cast(new CDocBuilderValue((bool)value)); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithInt(JNIEnv* env, jobject obj, jint value) +{ + return reinterpret_cast(new CDocBuilderValue((int)value)); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithDouble(JNIEnv* env, jobject obj, jdouble value) +{ + return reinterpret_cast(new CDocBuilderValue((double)value)); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithString(JNIEnv* env, jobject obj, jstring str) +{ + const char* strUtf = env->GetStringUTFChars(str, nullptr); + CDocBuilderValue* pValue = new CDocBuilderValue(strUtf); + env->ReleaseStringUTFChars(str, strUtf); + return reinterpret_cast(pValue); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1CreateUndefined(JNIEnv* env, jobject obj) +{ + return reinterpret_cast(new CDocBuilderValue(CDocBuilderValue::CreateUndefined())); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1CreateNull(JNIEnv* env, jobject obj) +{ + return reinterpret_cast(new CDocBuilderValue(CDocBuilderValue::CreateNull())); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1CreateArray(JNIEnv* env, jobject obj, jint length) +{ + return reinterpret_cast(new CDocBuilderValue(CDocBuilderValue::CreateArray((int)length))); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1Call0(JNIEnv* env, jobject obj, jlong self, jstring name) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + const char* strUtfName = env->GetStringUTFChars(name, nullptr); + CDocBuilderValue* pReturnValue = new CDocBuilderValue(pSelf->Call(strUtfName)); + env->ReleaseStringUTFChars(name, strUtfName); + return reinterpret_cast(pReturnValue); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1Call1(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + CDocBuilderValue* pParam1 = reinterpret_cast(p1); + const char* strUtfName = env->GetStringUTFChars(name, nullptr); + CDocBuilderValue* pReturnValue = new CDocBuilderValue(pSelf->Call(strUtfName, *pParam1)); + env->ReleaseStringUTFChars(name, strUtfName); + return reinterpret_cast(pReturnValue); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1Call2(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1, jlong p2) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + CDocBuilderValue* pParam1 = reinterpret_cast(p1); + CDocBuilderValue* pParam2 = reinterpret_cast(p2); + const char* strUtfName = env->GetStringUTFChars(name, nullptr); + CDocBuilderValue* pReturnValue = new CDocBuilderValue(pSelf->Call(strUtfName, *pParam1, *pParam2)); + env->ReleaseStringUTFChars(name, strUtfName); + return reinterpret_cast(pReturnValue); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1Call3(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1, jlong p2, jlong p3) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + CDocBuilderValue* pParam1 = reinterpret_cast(p1); + CDocBuilderValue* pParam2 = reinterpret_cast(p2); + CDocBuilderValue* pParam3 = reinterpret_cast(p3); + const char* strUtfName = env->GetStringUTFChars(name, nullptr); + CDocBuilderValue* pReturnValue = new CDocBuilderValue(pSelf->Call(strUtfName, *pParam1, *pParam2, *pParam3)); + env->ReleaseStringUTFChars(name, strUtfName); + return reinterpret_cast(pReturnValue); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1Call4(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1, jlong p2, jlong p3, jlong p4) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + CDocBuilderValue* pParam1 = reinterpret_cast(p1); + CDocBuilderValue* pParam2 = reinterpret_cast(p2); + CDocBuilderValue* pParam3 = reinterpret_cast(p3); + CDocBuilderValue* pParam4 = reinterpret_cast(p4); + const char* strUtfName = env->GetStringUTFChars(name, nullptr); + CDocBuilderValue* pReturnValue = new CDocBuilderValue(pSelf->Call(strUtfName, *pParam1, *pParam2, *pParam3, *pParam4)); + env->ReleaseStringUTFChars(name, strUtfName); + return reinterpret_cast(pReturnValue); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1Call5(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1, jlong p2, jlong p3, jlong p4, jlong p5) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + CDocBuilderValue* pParam1 = reinterpret_cast(p1); + CDocBuilderValue* pParam2 = reinterpret_cast(p2); + CDocBuilderValue* pParam3 = reinterpret_cast(p3); + CDocBuilderValue* pParam4 = reinterpret_cast(p4); + CDocBuilderValue* pParam5 = reinterpret_cast(p5); + const char* strUtfName = env->GetStringUTFChars(name, nullptr); + CDocBuilderValue* pReturnValue = new CDocBuilderValue(pSelf->Call(strUtfName, *pParam1, *pParam2, *pParam3, *pParam4, *pParam5)); + env->ReleaseStringUTFChars(name, strUtfName); + return reinterpret_cast(pReturnValue); +} + +jlong Java_docbuilder_CDocBuilderValue_c_1Call6(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1, jlong p2, jlong p3, jlong p4, jlong p5, jlong p6) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + CDocBuilderValue* pParam1 = reinterpret_cast(p1); + CDocBuilderValue* pParam2 = reinterpret_cast(p2); + CDocBuilderValue* pParam3 = reinterpret_cast(p3); + CDocBuilderValue* pParam4 = reinterpret_cast(p4); + CDocBuilderValue* pParam5 = reinterpret_cast(p5); + CDocBuilderValue* pParam6 = reinterpret_cast(p6); + const char* strUtfName = env->GetStringUTFChars(name, nullptr); + CDocBuilderValue* pReturnValue = new CDocBuilderValue(pSelf->Call(strUtfName, *pParam1, *pParam2, *pParam3, *pParam4, *pParam5, *pParam6)); + env->ReleaseStringUTFChars(name, strUtfName); + return reinterpret_cast(pReturnValue); +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h new file mode 100644 index 0000000000..e3af262940 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h @@ -0,0 +1,301 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class docbuilder_CDocBuilderValue */ + +#ifndef _Included_docbuilder_CDocBuilderValue +#define _Included_docbuilder_CDocBuilderValue +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Create + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Create + (JNIEnv *, jobject); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Copy + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Copy + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Destroy + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1Destroy + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_IsEmpty + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsEmpty + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Clear + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1Clear + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_IsNull + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsNull + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_IsUndefined + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsUndefined + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_IsInt + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsInt + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_IsDouble + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsDouble + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_IsString + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsString + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_IsFunction + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsFunction + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_IsObject + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsObject + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_IsArray + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsArray + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_GetLength + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilderValue_c_1GetLength + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_ToBool + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1ToBool + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_ToInt + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilderValue_c_1ToInt + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_ToDouble + * Signature: (J)D + */ +JNIEXPORT jdouble JNICALL Java_docbuilder_CDocBuilderValue_c_1ToDouble + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_ToString + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_docbuilder_CDocBuilderValue_c_1ToString + (JNIEnv *, jobject, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_GetProperty + * Signature: (JLjava/lang/String;)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1GetProperty + (JNIEnv *, jobject, jlong, jstring); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_GetByIndex + * Signature: (JI)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1GetByIndex + (JNIEnv *, jobject, jlong, jint); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_SetProperty + * Signature: (JLjava/lang/String;J)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1SetProperty + (JNIEnv *, jobject, jlong, jstring, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_SetByIndex + * Signature: (JIJ)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1SetByIndex + (JNIEnv *, jobject, jlong, jint, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_CreateWithBool + * Signature: (Z)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithBool + (JNIEnv *, jobject, jboolean); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_CreateWithInt + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithInt + (JNIEnv *, jobject, jint); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_CreateWithDouble + * Signature: (D)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithDouble + (JNIEnv *, jobject, jdouble); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_CreateWithString + * Signature: (Ljava/lang/String;)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithString + (JNIEnv *, jobject, jstring); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_CreateUndefined + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateUndefined + (JNIEnv *, jobject); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_CreateNull + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateNull + (JNIEnv *, jobject); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_CreateArray + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateArray + (JNIEnv *, jobject, jint); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Call0 + * Signature: (JLjava/lang/String;)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call0 + (JNIEnv *, jobject, jlong, jstring); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Call1 + * Signature: (JLjava/lang/String;J)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call1 + (JNIEnv *, jobject, jlong, jstring, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Call2 + * Signature: (JLjava/lang/String;JJ)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call2 + (JNIEnv *, jobject, jlong, jstring, jlong, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Call3 + * Signature: (JLjava/lang/String;JJJ)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call3 + (JNIEnv *, jobject, jlong, jstring, jlong, jlong, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Call4 + * Signature: (JLjava/lang/String;JJJJ)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call4 + (JNIEnv *, jobject, jlong, jstring, jlong, jlong, jlong, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Call5 + * Signature: (JLjava/lang/String;JJJJJ)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call5 + (JNIEnv *, jobject, jlong, jstring, jlong, jlong, jlong, jlong, jlong); + +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_Call6 + * Signature: (JLjava/lang/String;JJJJJJ)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call6 + (JNIEnv *, jobject, jlong, jstring, jlong, jlong, jlong, jlong, jlong, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro new file mode 100644 index 0000000000..77cf4c19e3 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro @@ -0,0 +1,38 @@ +QT -= core +QT -= gui + +TARGET = docbuilder.jni + +TEMPLATE = lib + +CONFIG += shared +CONFIG += plugin + +CORE_ROOT_DIR = $$PWD/../../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/Common/base.pri) +include($$CORE_ROOT_DIR/Common/3dParty/icu/icu.pri) + +ADD_DEPENDENCY(graphics, kernel, kernel_network, UnicodeConverter, doctrenderer) + +INCLUDEPATH += ../../.. + +# Specify JDK path here +JDK_PATH = "C:/Program Files/Java/jdk-22" + +INCLUDEPATH += $$JDK_PATH/include + +core_windows:JAVA_ARCH = win32 +core_linux:JAVA_ARCH = linux +core_mac:JAVA_ARCH = darwin + +INCLUDEPATH += $$JDK_PATH/include/$$JAVA_ARCH + + + +SOURCES += \ + docbuilder_CDocBuilderValue.cpp + +HEADERS += \ + docbuilder_CDocBuilderValue.h From 64afe550789966c153cea38f9f647a9a3e45210c Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Mon, 22 Jul 2024 15:28:15 +0400 Subject: [PATCH 03/26] Add Java code for `CDocBuilderValue` + Changed all JNI functions to static --- .../src/java/docbuilder/CDocBuilderValue.java | 245 +++++++++++++++--- .../src/jni/docbuilder_CDocBuilderValue.cpp | 72 ++--- .../src/jni/docbuilder_CDocBuilderValue.h | 72 ++--- 3 files changed, 281 insertions(+), 108 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java index 01153d0319..e520598ac4 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java @@ -1,52 +1,225 @@ package docbuilder; public class CDocBuilderValue { + public CDocBuilderValue() { + c_internal = c_Create(); + } + + private CDocBuilderValue(long internal) { + c_internal = internal; + } + + public CDocBuilderValue(CDocBuilderValue other) { + c_internal = c_Copy(other.c_internal); + } + + protected void finalize() + { + c_Destroy(c_internal); + } + + public boolean isEmpty() + { + return c_IsEmpty(c_internal); + } + + public void clear() + { + c_Clear(c_internal); + } + + public boolean isNull() + { + return c_IsNull(c_internal); + } + + public boolean isUndefined() + { + return c_IsUndefined(c_internal); + } + + public boolean isInt() + { + return c_IsInt(c_internal); + } + + public boolean isDouble() + { + return c_IsDouble(c_internal); + } + + public boolean isString() + { + return c_IsString(c_internal); + } + + public boolean isFunction() + { + return c_IsFunction(c_internal); + } + + public boolean isObject() + { + return c_IsObject(c_internal); + } + + public boolean isArray() + { + return c_IsArray(c_internal); + } + + public int getLength() + { + return c_GetLength(c_internal); + } + + public boolean toBool() + { + return c_ToBool(c_internal); + } + + public int toInt() + { + return c_ToInt(c_internal); + } + + public double toDouble() + { + return c_ToDouble(c_internal); + } + + public String toString() + { + return c_ToString(c_internal); + } + + public CDocBuilderValue getProperty(String name) { + return new CDocBuilderValue(c_GetProperty(c_internal, name)); + } + + public CDocBuilderValue get(String name) { + return new CDocBuilderValue(c_GetProperty(c_internal, name)); + } + + public CDocBuilderValue get(int index) { + return new CDocBuilderValue(c_GetByIndex(c_internal, index)); + } + + public void setProperty(String name, CDocBuilderValue value) { + c_SetProperty(c_internal, name, value.c_internal); + } + + public void set(String name, CDocBuilderValue value) { + c_SetProperty(c_internal, name, value.c_internal); + } + + public void set(int index, CDocBuilderValue value) { + c_SetByIndex(c_internal, index, value.c_internal); + } + + public CDocBuilderValue(boolean value) { + c_internal = c_CreateWithBool(value); + } + + public CDocBuilderValue(int value) { + c_internal = c_CreateWithInt(value); + } + + public CDocBuilderValue(double value) { + c_internal = c_CreateWithDouble(value); + } + + public CDocBuilderValue(String value) { + c_internal = c_CreateWithString(value); + } + + public static CDocBuilderValue createUndefined() { + return new CDocBuilderValue(c_CreateUndefined()); + } + + public static CDocBuilderValue createNull() { + return new CDocBuilderValue(c_CreateNull()); + } + + public static CDocBuilderValue createArray(int length) { + return new CDocBuilderValue(c_CreateArray(length)); + } + + public CDocBuilderValue Call(String name) { + return new CDocBuilderValue(c_Call0(c_internal, name)); + } + + public CDocBuilderValue Call(String name, CDocBuilderValue p1) { + return new CDocBuilderValue(c_Call1(c_internal, name, p1.c_internal)); + } + + public CDocBuilderValue Call(String name, CDocBuilderValue p1, CDocBuilderValue p2) { + return new CDocBuilderValue(c_Call2(c_internal, name, p1.c_internal, p2.c_internal)); + } + + public CDocBuilderValue Call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3) { + return new CDocBuilderValue(c_Call3(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal)); + } + + public CDocBuilderValue Call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4) { + return new CDocBuilderValue(c_Call4(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal, p4.c_internal)); + } + + public CDocBuilderValue Call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5) { + return new CDocBuilderValue(c_Call5(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal, p4.c_internal, p5.c_internal)); + } + + public CDocBuilderValue Call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5, CDocBuilderValue p6) { + return new CDocBuilderValue(c_Call6(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal, p4.c_internal, p5.c_internal, p6.c_internal)); + } + + private long c_internal = 0; // NATIVE METHODS: - private native long c_Create(); - private native long c_Copy(long other); - private native void c_Destroy(long self); + private static native long c_Create(); + private static native long c_Copy(long other); + private static native void c_Destroy(long self); - private native boolean c_IsEmpty(long self); - private native void c_Clear(long self); + private static native boolean c_IsEmpty(long self); + private static native void c_Clear(long self); - private native boolean c_IsNull(long self); - private native boolean c_IsUndefined(long self); - private native boolean c_IsInt(long self); - private native boolean c_IsDouble(long self); - private native boolean c_IsString(long self); - private native boolean c_IsFunction(long self); - private native boolean c_IsObject(long self); - private native boolean c_IsArray(long self); + private static native boolean c_IsNull(long self); + private static native boolean c_IsUndefined(long self); + private static native boolean c_IsInt(long self); + private static native boolean c_IsDouble(long self); + private static native boolean c_IsString(long self); + private static native boolean c_IsFunction(long self); + private static native boolean c_IsObject(long self); + private static native boolean c_IsArray(long self); - private native int c_GetLength(long self); + private static native int c_GetLength(long self); - private native boolean c_ToBool(long self); - private native int c_ToInt(long self); - private native double c_ToDouble(long self); - private native String c_ToString(long self); + private static native boolean c_ToBool(long self); + private static native int c_ToInt(long self); + private static native double c_ToDouble(long self); + private static native String c_ToString(long self); - private native long c_GetProperty(long self, String name); - private native long c_GetByIndex(long self, int index); + private static native long c_GetProperty(long self, String name); + private static native long c_GetByIndex(long self, int index); - private native void c_SetProperty(long self, String name, long value); - private native void c_SetByIndex(long self, int index, long value); + private static native void c_SetProperty(long self, String name, long value); + private static native void c_SetByIndex(long self, int index, long value); - private native long c_CreateWithBool(boolean value); - private native long c_CreateWithInt(int value); - private native long c_CreateWithDouble(double value); - private native long c_CreateWithString(String value); + private static native long c_CreateWithBool(boolean value); + private static native long c_CreateWithInt(int value); + private static native long c_CreateWithDouble(double value); + private static native long c_CreateWithString(String value); - private native long c_CreateUndefined(); - private native long c_CreateNull(); - private native long c_CreateArray(int length); + private static native long c_CreateUndefined(); + private static native long c_CreateNull(); + private static native long c_CreateArray(int length); - private native long c_Call0(long self, String name); - private native long c_Call1(long self, String name, long p1); - private native long c_Call2(long self, String name, long p1, long p2); - private native long c_Call3(long self, String name, long p1, long p2, long p3); - private native long c_Call4(long self, String name, long p1, long p2, long p3, long p4); - private native long c_Call5(long self, String name, long p1, long p2, long p3, long p4, long p5); - private native long c_Call6(long self, String name, long p1, long p2, long p3, long p4, long p5, long p6); + private static native long c_Call0(long self, String name); + private static native long c_Call1(long self, String name, long p1); + private static native long c_Call2(long self, String name, long p1, long p2); + private static native long c_Call3(long self, String name, long p1, long p2, long p3); + private static native long c_Call4(long self, String name, long p1, long p2, long p3, long p4); + private static native long c_Call5(long self, String name, long p1, long p2, long p3, long p4, long p5); + private static native long c_Call6(long self, String name, long p1, long p2, long p3, long p4, long p5, long p6); } diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp index b969266ae2..887497c17a 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp @@ -8,108 +8,108 @@ using namespace NSDoctRenderer; -jlong Java_docbuilder_CDocBuilderValue_c_1Create(JNIEnv* env, jobject obj) +jlong Java_docbuilder_CDocBuilderValue_c_1Create(JNIEnv* env, jclass cls) { return reinterpret_cast(new CDocBuilderValue()); } -jlong Java_docbuilder_CDocBuilderValue_c_1Copy(JNIEnv* env, jobject obj, jlong other) +jlong Java_docbuilder_CDocBuilderValue_c_1Copy(JNIEnv* env, jclass cls, jlong other) { CDocBuilderValue* pOther = reinterpret_cast(other); return reinterpret_cast(new CDocBuilderValue(*pOther)); } -void Java_docbuilder_CDocBuilderValue_c_1Destroy(JNIEnv* env, jobject obj, jlong self) +void Java_docbuilder_CDocBuilderValue_c_1Destroy(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); delete pSelf; } -jboolean Java_docbuilder_CDocBuilderValue_c_1IsEmpty(JNIEnv* env, jobject obj, jlong self) +jboolean Java_docbuilder_CDocBuilderValue_c_1IsEmpty(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jboolean)pSelf->IsEmpty(); } -void Java_docbuilder_CDocBuilderValue_c_1Clear(JNIEnv* env, jobject obj, jlong self) +void Java_docbuilder_CDocBuilderValue_c_1Clear(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); pSelf->Clear(); } -jboolean Java_docbuilder_CDocBuilderValue_c_1IsNull(JNIEnv* env, jobject obj, jlong self) +jboolean Java_docbuilder_CDocBuilderValue_c_1IsNull(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jboolean)pSelf->IsNull(); } -jboolean Java_docbuilder_CDocBuilderValue_c_1IsUndefined(JNIEnv* env, jobject obj, jlong self) +jboolean Java_docbuilder_CDocBuilderValue_c_1IsUndefined(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jboolean)pSelf->IsUndefined(); } -jboolean Java_docbuilder_CDocBuilderValue_c_1IsInt(JNIEnv* env, jobject obj, jlong self) +jboolean Java_docbuilder_CDocBuilderValue_c_1IsInt(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jboolean)pSelf->IsInt(); } -jboolean Java_docbuilder_CDocBuilderValue_c_1IsDouble(JNIEnv* env, jobject obj, jlong self) +jboolean Java_docbuilder_CDocBuilderValue_c_1IsDouble(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jboolean)pSelf->IsDouble(); } -jboolean Java_docbuilder_CDocBuilderValue_c_1IsString(JNIEnv* env, jobject obj, jlong self) +jboolean Java_docbuilder_CDocBuilderValue_c_1IsString(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jboolean)pSelf->IsString(); } -jboolean Java_docbuilder_CDocBuilderValue_c_1IsFunction(JNIEnv* env, jobject obj, jlong self) +jboolean Java_docbuilder_CDocBuilderValue_c_1IsFunction(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jboolean)pSelf->IsFunction(); } -jboolean Java_docbuilder_CDocBuilderValue_c_1IsObject(JNIEnv* env, jobject obj, jlong self) +jboolean Java_docbuilder_CDocBuilderValue_c_1IsObject(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jboolean)pSelf->IsObject(); } -jboolean Java_docbuilder_CDocBuilderValue_c_1IsArray(JNIEnv* env, jobject obj, jlong self) +jboolean Java_docbuilder_CDocBuilderValue_c_1IsArray(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jboolean)pSelf->IsArray(); } -jint Java_docbuilder_CDocBuilderValue_c_1GetLength(JNIEnv* env, jobject obj, jlong self) +jint Java_docbuilder_CDocBuilderValue_c_1GetLength(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jint)pSelf->GetLength(); } -jboolean Java_docbuilder_CDocBuilderValue_c_1ToBool(JNIEnv* env, jobject obj, jlong self) +jboolean Java_docbuilder_CDocBuilderValue_c_1ToBool(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jboolean)pSelf->ToBool(); } -jint Java_docbuilder_CDocBuilderValue_c_1ToInt(JNIEnv* env, jobject obj, jlong self) +jint Java_docbuilder_CDocBuilderValue_c_1ToInt(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jint)pSelf->ToInt(); } -jdouble Java_docbuilder_CDocBuilderValue_c_1ToDouble(JNIEnv* env, jobject obj, jlong self) +jdouble Java_docbuilder_CDocBuilderValue_c_1ToDouble(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); return (jdouble)pSelf->ToDouble(); } -jstring Java_docbuilder_CDocBuilderValue_c_1ToString(JNIEnv* env, jobject obj, jlong self) +jstring Java_docbuilder_CDocBuilderValue_c_1ToString(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); CString strValue = pSelf->ToString(); @@ -117,7 +117,7 @@ jstring Java_docbuilder_CDocBuilderValue_c_1ToString(JNIEnv* env, jobject obj, j return env->NewStringUTF(strUtfData.c_str()); } -jlong Java_docbuilder_CDocBuilderValue_c_1GetProperty(JNIEnv* env, jobject obj, jlong self, jstring name) +jlong Java_docbuilder_CDocBuilderValue_c_1GetProperty(JNIEnv* env, jclass cls, jlong self, jstring name) { CDocBuilderValue* pSelf = reinterpret_cast(self); const char* strUtfName = env->GetStringUTFChars(name, nullptr); @@ -126,14 +126,14 @@ jlong Java_docbuilder_CDocBuilderValue_c_1GetProperty(JNIEnv* env, jobject obj, return reinterpret_cast(pValue); } -jlong Java_docbuilder_CDocBuilderValue_c_1GetByIndex(JNIEnv* env, jobject obj, jlong self, jint index) +jlong Java_docbuilder_CDocBuilderValue_c_1GetByIndex(JNIEnv* env, jclass cls, jlong self, jint index) { CDocBuilderValue* pSelf = reinterpret_cast(self); CDocBuilderValue* pValue = new CDocBuilderValue(pSelf->Get((int)index)); return reinterpret_cast(pValue); } -void Java_docbuilder_CDocBuilderValue_c_1SetProperty(JNIEnv* env, jobject obj, jlong self, jstring name, jlong value) +void Java_docbuilder_CDocBuilderValue_c_1SetProperty(JNIEnv* env, jclass cls, jlong self, jstring name, jlong value) { CDocBuilderValue* pSelf = reinterpret_cast(self); CDocBuilderValue* pValue = reinterpret_cast(value); @@ -143,29 +143,29 @@ void Java_docbuilder_CDocBuilderValue_c_1SetProperty(JNIEnv* env, jobject obj, j env->ReleaseStringUTFChars(name, strUtfName); } -void Java_docbuilder_CDocBuilderValue_c_1SetByIndex(JNIEnv* env, jobject obj, jlong self, jint index, jlong value) +void Java_docbuilder_CDocBuilderValue_c_1SetByIndex(JNIEnv* env, jclass cls, jlong self, jint index, jlong value) { CDocBuilderValue* pSelf = reinterpret_cast(self); CDocBuilderValue* pValue = reinterpret_cast(value); pSelf->Set((int)index, pValue); } -jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithBool(JNIEnv* env, jobject obj, jboolean value) +jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithBool(JNIEnv* env, jclass cls, jboolean value) { return reinterpret_cast(new CDocBuilderValue((bool)value)); } -jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithInt(JNIEnv* env, jobject obj, jint value) +jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithInt(JNIEnv* env, jclass cls, jint value) { return reinterpret_cast(new CDocBuilderValue((int)value)); } -jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithDouble(JNIEnv* env, jobject obj, jdouble value) +jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithDouble(JNIEnv* env, jclass cls, jdouble value) { return reinterpret_cast(new CDocBuilderValue((double)value)); } -jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithString(JNIEnv* env, jobject obj, jstring str) +jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithString(JNIEnv* env, jclass cls, jstring str) { const char* strUtf = env->GetStringUTFChars(str, nullptr); CDocBuilderValue* pValue = new CDocBuilderValue(strUtf); @@ -173,22 +173,22 @@ jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithString(JNIEnv* env, jobject return reinterpret_cast(pValue); } -jlong Java_docbuilder_CDocBuilderValue_c_1CreateUndefined(JNIEnv* env, jobject obj) +jlong Java_docbuilder_CDocBuilderValue_c_1CreateUndefined(JNIEnv* env, jclass cls) { return reinterpret_cast(new CDocBuilderValue(CDocBuilderValue::CreateUndefined())); } -jlong Java_docbuilder_CDocBuilderValue_c_1CreateNull(JNIEnv* env, jobject obj) +jlong Java_docbuilder_CDocBuilderValue_c_1CreateNull(JNIEnv* env, jclass cls) { return reinterpret_cast(new CDocBuilderValue(CDocBuilderValue::CreateNull())); } -jlong Java_docbuilder_CDocBuilderValue_c_1CreateArray(JNIEnv* env, jobject obj, jint length) +jlong Java_docbuilder_CDocBuilderValue_c_1CreateArray(JNIEnv* env, jclass cls, jint length) { return reinterpret_cast(new CDocBuilderValue(CDocBuilderValue::CreateArray((int)length))); } -jlong Java_docbuilder_CDocBuilderValue_c_1Call0(JNIEnv* env, jobject obj, jlong self, jstring name) +jlong Java_docbuilder_CDocBuilderValue_c_1Call0(JNIEnv* env, jclass cls, jlong self, jstring name) { CDocBuilderValue* pSelf = reinterpret_cast(self); const char* strUtfName = env->GetStringUTFChars(name, nullptr); @@ -197,7 +197,7 @@ jlong Java_docbuilder_CDocBuilderValue_c_1Call0(JNIEnv* env, jobject obj, jlong return reinterpret_cast(pReturnValue); } -jlong Java_docbuilder_CDocBuilderValue_c_1Call1(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1) +jlong Java_docbuilder_CDocBuilderValue_c_1Call1(JNIEnv* env, jclass cls, jlong self, jstring name, jlong p1) { CDocBuilderValue* pSelf = reinterpret_cast(self); CDocBuilderValue* pParam1 = reinterpret_cast(p1); @@ -207,7 +207,7 @@ jlong Java_docbuilder_CDocBuilderValue_c_1Call1(JNIEnv* env, jobject obj, jlong return reinterpret_cast(pReturnValue); } -jlong Java_docbuilder_CDocBuilderValue_c_1Call2(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1, jlong p2) +jlong Java_docbuilder_CDocBuilderValue_c_1Call2(JNIEnv* env, jclass cls, jlong self, jstring name, jlong p1, jlong p2) { CDocBuilderValue* pSelf = reinterpret_cast(self); CDocBuilderValue* pParam1 = reinterpret_cast(p1); @@ -218,7 +218,7 @@ jlong Java_docbuilder_CDocBuilderValue_c_1Call2(JNIEnv* env, jobject obj, jlong return reinterpret_cast(pReturnValue); } -jlong Java_docbuilder_CDocBuilderValue_c_1Call3(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1, jlong p2, jlong p3) +jlong Java_docbuilder_CDocBuilderValue_c_1Call3(JNIEnv* env, jclass cls, jlong self, jstring name, jlong p1, jlong p2, jlong p3) { CDocBuilderValue* pSelf = reinterpret_cast(self); CDocBuilderValue* pParam1 = reinterpret_cast(p1); @@ -230,7 +230,7 @@ jlong Java_docbuilder_CDocBuilderValue_c_1Call3(JNIEnv* env, jobject obj, jlong return reinterpret_cast(pReturnValue); } -jlong Java_docbuilder_CDocBuilderValue_c_1Call4(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1, jlong p2, jlong p3, jlong p4) +jlong Java_docbuilder_CDocBuilderValue_c_1Call4(JNIEnv* env, jclass cls, jlong self, jstring name, jlong p1, jlong p2, jlong p3, jlong p4) { CDocBuilderValue* pSelf = reinterpret_cast(self); CDocBuilderValue* pParam1 = reinterpret_cast(p1); @@ -243,7 +243,7 @@ jlong Java_docbuilder_CDocBuilderValue_c_1Call4(JNIEnv* env, jobject obj, jlong return reinterpret_cast(pReturnValue); } -jlong Java_docbuilder_CDocBuilderValue_c_1Call5(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1, jlong p2, jlong p3, jlong p4, jlong p5) +jlong Java_docbuilder_CDocBuilderValue_c_1Call5(JNIEnv* env, jclass cls, jlong self, jstring name, jlong p1, jlong p2, jlong p3, jlong p4, jlong p5) { CDocBuilderValue* pSelf = reinterpret_cast(self); CDocBuilderValue* pParam1 = reinterpret_cast(p1); @@ -257,7 +257,7 @@ jlong Java_docbuilder_CDocBuilderValue_c_1Call5(JNIEnv* env, jobject obj, jlong return reinterpret_cast(pReturnValue); } -jlong Java_docbuilder_CDocBuilderValue_c_1Call6(JNIEnv* env, jobject obj, jlong self, jstring name, jlong p1, jlong p2, jlong p3, jlong p4, jlong p5, jlong p6) +jlong Java_docbuilder_CDocBuilderValue_c_1Call6(JNIEnv* env, jclass cls, jlong self, jstring name, jlong p1, jlong p2, jlong p3, jlong p4, jlong p5, jlong p6) { CDocBuilderValue* pSelf = reinterpret_cast(self); CDocBuilderValue* pParam1 = reinterpret_cast(p1); diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h index e3af262940..2e0c8e4eb0 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h @@ -13,7 +13,7 @@ extern "C" { * Signature: ()J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Create - (JNIEnv *, jobject); + (JNIEnv *, jclass); /* * Class: docbuilder_CDocBuilderValue @@ -21,7 +21,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Create * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Copy - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -29,7 +29,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Copy * Signature: (J)V */ JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1Destroy - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -37,7 +37,7 @@ JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1Destroy * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsEmpty - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -45,7 +45,7 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsEmpty * Signature: (J)V */ JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1Clear - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -53,7 +53,7 @@ JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1Clear * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsNull - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -61,7 +61,7 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsNull * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsUndefined - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -69,7 +69,7 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsUndefined * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsInt - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -77,7 +77,7 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsInt * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsDouble - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -85,7 +85,7 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsDouble * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsString - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -93,7 +93,7 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsString * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsFunction - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -101,7 +101,7 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsFunction * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsObject - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -109,7 +109,7 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsObject * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsArray - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -117,7 +117,7 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsArray * Signature: (J)I */ JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilderValue_c_1GetLength - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -125,7 +125,7 @@ JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilderValue_c_1GetLength * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1ToBool - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -133,7 +133,7 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1ToBool * Signature: (J)I */ JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilderValue_c_1ToInt - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -141,7 +141,7 @@ JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilderValue_c_1ToInt * Signature: (J)D */ JNIEXPORT jdouble JNICALL Java_docbuilder_CDocBuilderValue_c_1ToDouble - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -149,7 +149,7 @@ JNIEXPORT jdouble JNICALL Java_docbuilder_CDocBuilderValue_c_1ToDouble * Signature: (J)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_docbuilder_CDocBuilderValue_c_1ToString - (JNIEnv *, jobject, jlong); + (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -157,7 +157,7 @@ JNIEXPORT jstring JNICALL Java_docbuilder_CDocBuilderValue_c_1ToString * Signature: (JLjava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1GetProperty - (JNIEnv *, jobject, jlong, jstring); + (JNIEnv *, jclass, jlong, jstring); /* * Class: docbuilder_CDocBuilderValue @@ -165,7 +165,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1GetProperty * Signature: (JI)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1GetByIndex - (JNIEnv *, jobject, jlong, jint); + (JNIEnv *, jclass, jlong, jint); /* * Class: docbuilder_CDocBuilderValue @@ -173,7 +173,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1GetByIndex * Signature: (JLjava/lang/String;J)V */ JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1SetProperty - (JNIEnv *, jobject, jlong, jstring, jlong); + (JNIEnv *, jclass, jlong, jstring, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -181,7 +181,7 @@ JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1SetProperty * Signature: (JIJ)V */ JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1SetByIndex - (JNIEnv *, jobject, jlong, jint, jlong); + (JNIEnv *, jclass, jlong, jint, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -189,7 +189,7 @@ JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderValue_c_1SetByIndex * Signature: (Z)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithBool - (JNIEnv *, jobject, jboolean); + (JNIEnv *, jclass, jboolean); /* * Class: docbuilder_CDocBuilderValue @@ -197,7 +197,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithBool * Signature: (I)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithInt - (JNIEnv *, jobject, jint); + (JNIEnv *, jclass, jint); /* * Class: docbuilder_CDocBuilderValue @@ -205,7 +205,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithInt * Signature: (D)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithDouble - (JNIEnv *, jobject, jdouble); + (JNIEnv *, jclass, jdouble); /* * Class: docbuilder_CDocBuilderValue @@ -213,7 +213,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithDouble * Signature: (Ljava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithString - (JNIEnv *, jobject, jstring); + (JNIEnv *, jclass, jstring); /* * Class: docbuilder_CDocBuilderValue @@ -221,7 +221,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateWithString * Signature: ()J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateUndefined - (JNIEnv *, jobject); + (JNIEnv *, jclass); /* * Class: docbuilder_CDocBuilderValue @@ -229,7 +229,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateUndefined * Signature: ()J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateNull - (JNIEnv *, jobject); + (JNIEnv *, jclass); /* * Class: docbuilder_CDocBuilderValue @@ -237,7 +237,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateNull * Signature: (I)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateArray - (JNIEnv *, jobject, jint); + (JNIEnv *, jclass, jint); /* * Class: docbuilder_CDocBuilderValue @@ -245,7 +245,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1CreateArray * Signature: (JLjava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call0 - (JNIEnv *, jobject, jlong, jstring); + (JNIEnv *, jclass, jlong, jstring); /* * Class: docbuilder_CDocBuilderValue @@ -253,7 +253,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call0 * Signature: (JLjava/lang/String;J)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call1 - (JNIEnv *, jobject, jlong, jstring, jlong); + (JNIEnv *, jclass, jlong, jstring, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -261,7 +261,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call1 * Signature: (JLjava/lang/String;JJ)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call2 - (JNIEnv *, jobject, jlong, jstring, jlong, jlong); + (JNIEnv *, jclass, jlong, jstring, jlong, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -269,7 +269,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call2 * Signature: (JLjava/lang/String;JJJ)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call3 - (JNIEnv *, jobject, jlong, jstring, jlong, jlong, jlong); + (JNIEnv *, jclass, jlong, jstring, jlong, jlong, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -277,7 +277,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call3 * Signature: (JLjava/lang/String;JJJJ)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call4 - (JNIEnv *, jobject, jlong, jstring, jlong, jlong, jlong, jlong); + (JNIEnv *, jclass, jlong, jstring, jlong, jlong, jlong, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -285,7 +285,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call4 * Signature: (JLjava/lang/String;JJJJJ)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call5 - (JNIEnv *, jobject, jlong, jstring, jlong, jlong, jlong, jlong, jlong); + (JNIEnv *, jclass, jlong, jstring, jlong, jlong, jlong, jlong, jlong); /* * Class: docbuilder_CDocBuilderValue @@ -293,7 +293,7 @@ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call5 * Signature: (JLjava/lang/String;JJJJJJ)J */ JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderValue_c_1Call6 - (JNIEnv *, jobject, jlong, jstring, jlong, jlong, jlong, jlong, jlong, jlong); + (JNIEnv *, jclass, jlong, jstring, jlong, jlong, jlong, jlong, jlong, jlong); #ifdef __cplusplus } From c8c4edf592d6547a14f616bc0865324909fc5260 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Mon, 22 Jul 2024 16:37:17 +0400 Subject: [PATCH 04/26] Add JNI code for `CDocBuilder` --- .../src/java/docbuilder/CDocBuilder.java | 43 ++++ .../src/jni/docbuilder_CDocBuilder.cpp | 179 ++++++++++++++++ .../src/jni/docbuilder_CDocBuilder.h | 197 ++++++++++++++++++ .../src/jni/docbuilder_jni.pro | 8 +- 4 files changed, 423 insertions(+), 4 deletions(-) create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilder.cpp create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilder.h diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java new file mode 100644 index 0000000000..2b2f33882d --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java @@ -0,0 +1,43 @@ +package docbuilder; + +public class CDocBuilder { + + private long c_internal = 0; + + // NATIVE METHODS: + private static native long c_Create(); + private static native void c_Destroy(long self); + + private static native int c_OpenFile(long self, String path, String params); + private static native boolean c_CreateFileByType(long self, int type); + private static native boolean c_CreateFileByExtension(long self, String extension); + + private static native void c_SetTmpFolder(long self, String folder); + + private static native int c_SaveFileByType(long self, int type, String path); + private static native int c_SaveFileByTypeWithParams(long self, int type, String path, String params); + private static native int c_SaveFileByExtension(long self, String extension, String path); + private static native int c_SaveFileByExtensionWithParams(long self, String extension, String path, String params); + + private static native void c_CloseFile(long self); + + private static native boolean c_ExecuteCommand(long self, String command); + private static native boolean c_ExecuteCommandWithRetValue(long self, String command, long retValue); + + private static native boolean c_Run(long self, String path); + private static native boolean c_RunText(long self, String commands); + + private static native void c_SetProperty(long self, String param, String value); + + private static native void c_WriteData(long self, String path, String value, boolean append); + + private static native boolean c_IsSaveWithDoctrendererMode(long self); + + private static native String c_GetVersion(long self); + + private static native long c_GetContext(long self); + + private static native void c_Initialize(); + private static native void c_InitializeWithDirectory(String directory); + private static native void c_Dispose(); +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilder.cpp b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilder.cpp new file mode 100644 index 0000000000..4873c76436 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilder.cpp @@ -0,0 +1,179 @@ +#include "docbuilder_CDocBuilder.h" + +#include + +#include "docbuilder.h" +// for wchar_t <=> char conversion +#include "../../../../common/File.h" + +using namespace NSDoctRenderer; + +static std::wstring wstringFromJavaString(JNIEnv* env, jstring jstr) +{ + const char* strUtf = env->GetStringUTFChars(jstr, nullptr); + std::wstring wstr = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)strUtf, (LONG)strlen(strUtf)); + env->ReleaseStringUTFChars(jstr, strUtf); + return wstr; +} + +jlong Java_docbuilder_CDocBuilder_c_1Create(JNIEnv* env, jclass cls) +{ + return reinterpret_cast(new CDocBuilder()); +} + +void Java_docbuilder_CDocBuilder_c_1Destroy(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + delete pSelf; +} + +jint Java_docbuilder_CDocBuilder_c_1OpenFile(JNIEnv* env, jclass cls, jlong self, jstring path, jstring params) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strPath = wstringFromJavaString(env, path); + std::wstring strParams = wstringFromJavaString(env, params); + return (jint)pSelf->OpenFile(strPath.c_str(), strParams.c_str()); +} + +jboolean Java_docbuilder_CDocBuilder_c_1CreateFileByType(JNIEnv* env, jclass cls, jlong self, jint type) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->CreateFile((int)type); +} + +jboolean Java_docbuilder_CDocBuilder_c_1CreateFileByExtension(JNIEnv* env, jclass cls, jlong self, jstring extension) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strExtension = wstringFromJavaString(env, extension); + return (jboolean)pSelf->CreateFile(strExtension.c_str()); +} + +void Java_docbuilder_CDocBuilder_c_1SetTmpFolder(JNIEnv* env, jclass cls, jlong self, jstring folder) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strFolder = wstringFromJavaString(env, folder); + pSelf->SetTmpFolder(strFolder.c_str()); +} + +jint Java_docbuilder_CDocBuilder_c_1SaveFileByType(JNIEnv* env, jclass cls, jlong self, jint type, jstring path) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strPath = wstringFromJavaString(env, path); + return (jint)pSelf->SaveFile((int)type, strPath.c_str()); +} + +jint Java_docbuilder_CDocBuilder_c_1SaveFileByTypeWithParams(JNIEnv* env, jclass cls, jlong self, jint type, jstring path, jstring params) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strPath = wstringFromJavaString(env, path); + std::wstring strParams = wstringFromJavaString(env, params); + return (jint)pSelf->SaveFile((int)type, strPath.c_str(), strParams.c_str()); +} + +jint Java_docbuilder_CDocBuilder_c_1SaveFileByExtension(JNIEnv* env, jclass cls, jlong self, jstring extension, jstring path) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strExtension = wstringFromJavaString(env, extension); + std::wstring strPath = wstringFromJavaString(env, path); + return (jint)pSelf->SaveFile(strExtension.c_str(), strPath.c_str()); +} + +jint Java_docbuilder_CDocBuilder_c_1SaveFileByExtensionWithParams(JNIEnv* env, jclass cls, jlong self, jstring extension, jstring path, jstring params) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strExtension = wstringFromJavaString(env, extension); + std::wstring strPath = wstringFromJavaString(env, path); + std::wstring strParams = wstringFromJavaString(env, params); + return (jint)pSelf->SaveFile(strExtension.c_str(), strPath.c_str(), strParams.c_str()); +} + +void Java_docbuilder_CDocBuilder_c_1CloseFile(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + pSelf->CloseFile(); +} + +jboolean Java_docbuilder_CDocBuilder_c_1ExecuteCommand(JNIEnv* env, jclass cls, jlong self, jstring command) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strCommand = wstringFromJavaString(env, command); + return (jboolean)pSelf->ExecuteCommand(strCommand.c_str()); +} + +jboolean Java_docbuilder_CDocBuilder_c_1ExecuteCommandWithRetValue(JNIEnv* env, jclass cls, jlong self, jstring command, jlong retValue) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strCommand = wstringFromJavaString(env, command); + CDocBuilderValue* pRetValue = reinterpret_cast(retValue); + return (jboolean)pSelf->ExecuteCommand(strCommand.c_str(), pRetValue); +} + +jboolean Java_docbuilder_CDocBuilder_c_1Run(JNIEnv* env, jclass cls, jlong self, jstring path) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strPath = wstringFromJavaString(env, path); + return (jboolean)pSelf->Run(strPath.c_str()); +} + +jboolean Java_docbuilder_CDocBuilder_c_1RunText(JNIEnv* env, jclass cls, jlong self, jstring commands) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + const char* strUtfCommands = env->GetStringUTFChars(commands, nullptr); + jboolean result = (jboolean)pSelf->RunTextA(strUtfCommands); + env->ReleaseStringUTFChars(commands, strUtfCommands); + return result; +} + +void Java_docbuilder_CDocBuilder_c_1SetProperty(JNIEnv* env, jclass cls, jlong self, jstring param, jstring value) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + const char* strUtfParam = env->GetStringUTFChars(param, nullptr); + std::wstring strValue = wstringFromJavaString(env, value); + pSelf->SetProperty(strUtfParam, strValue.c_str()); + env->ReleaseStringUTFChars(param, strUtfParam); +} + +void Java_docbuilder_CDocBuilder_c_1WriteData(JNIEnv* env, jclass cls, jlong self, jstring path, jstring data, jboolean append) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + std::wstring strPath = wstringFromJavaString(env, path); + std::wstring strData = wstringFromJavaString(env, data); + pSelf->WriteData(strPath.c_str(), strData.c_str(), (bool)append); +} + +jboolean Java_docbuilder_CDocBuilder_c_1IsSaveWithDoctrendererMode(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsSaveWithDoctrendererMode(); +} + +jstring Java_docbuilder_CDocBuilder_c_1GetVersion(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + char* strUtfVersion = pSelf->GetVersion(); + jstring jstrVersion = env->NewStringUTF(strUtfVersion); + delete[] strUtfVersion; + return jstrVersion; +} + +jlong Java_docbuilder_CDocBuilder_c_1GetContext(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilder* pSelf = reinterpret_cast(self); + return reinterpret_cast(new CDocBuilderContext(pSelf->GetContext())); +} + +void Java_docbuilder_CDocBuilder_c_1Initialize(JNIEnv* env, jclass cls) +{ + CDocBuilder::Initialize(); +} + +void Java_docbuilder_CDocBuilder_c_1InitializeWithDirectory(JNIEnv* env, jclass cls, jstring directory) +{ + std::wstring strDirectory = wstringFromJavaString(env, directory); + CDocBuilder::Initialize(strDirectory.c_str()); +} + +void Java_docbuilder_CDocBuilder_c_1Dispose(JNIEnv* env, jclass cls) +{ + CDocBuilder::Dispose(); +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilder.h b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilder.h new file mode 100644 index 0000000000..f7fce7a1eb --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilder.h @@ -0,0 +1,197 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class docbuilder_CDocBuilder */ + +#ifndef _Included_docbuilder_CDocBuilder +#define _Included_docbuilder_CDocBuilder +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: docbuilder_CDocBuilder + * Method: c_Create + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilder_c_1Create + (JNIEnv *, jclass); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_Destroy + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilder_c_1Destroy + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_OpenFile + * Signature: (JLjava/lang/String;Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilder_c_1OpenFile + (JNIEnv *, jclass, jlong, jstring, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_CreateFileByType + * Signature: (JI)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilder_c_1CreateFileByType + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_CreateFileByExtension + * Signature: (JLjava/lang/String;)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilder_c_1CreateFileByExtension + (JNIEnv *, jclass, jlong, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_SetTmpFolder + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilder_c_1SetTmpFolder + (JNIEnv *, jclass, jlong, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_SaveFileByType + * Signature: (JILjava/lang/String;)I + */ +JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilder_c_1SaveFileByType + (JNIEnv *, jclass, jlong, jint, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_SaveFileByTypeWithParams + * Signature: (JILjava/lang/String;Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilder_c_1SaveFileByTypeWithParams + (JNIEnv *, jclass, jlong, jint, jstring, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_SaveFileByExtension + * Signature: (JLjava/lang/String;Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilder_c_1SaveFileByExtension + (JNIEnv *, jclass, jlong, jstring, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_SaveFileByExtensionWithParams + * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL Java_docbuilder_CDocBuilder_c_1SaveFileByExtensionWithParams + (JNIEnv *, jclass, jlong, jstring, jstring, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_CloseFile + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilder_c_1CloseFile + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_ExecuteCommand + * Signature: (JLjava/lang/String;)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilder_c_1ExecuteCommand + (JNIEnv *, jclass, jlong, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_ExecuteCommandWithRetValue + * Signature: (JLjava/lang/String;J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilder_c_1ExecuteCommandWithRetValue + (JNIEnv *, jclass, jlong, jstring, jlong); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_Run + * Signature: (JLjava/lang/String;)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilder_c_1Run + (JNIEnv *, jclass, jlong, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_RunText + * Signature: (JLjava/lang/String;)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilder_c_1RunText + (JNIEnv *, jclass, jlong, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_SetProperty + * Signature: (JLjava/lang/String;Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilder_c_1SetProperty + (JNIEnv *, jclass, jlong, jstring, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_WriteData + * Signature: (JLjava/lang/String;Ljava/lang/String;Z)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilder_c_1WriteData + (JNIEnv *, jclass, jlong, jstring, jstring, jboolean); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_IsSaveWithDoctrendererMode + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilder_c_1IsSaveWithDoctrendererMode + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_GetVersion + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_docbuilder_CDocBuilder_c_1GetVersion + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_GetContext + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilder_c_1GetContext + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_Initialize + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilder_c_1Initialize + (JNIEnv *, jclass); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_InitializeWithDirectory + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilder_c_1InitializeWithDirectory + (JNIEnv *, jclass, jstring); + +/* + * Class: docbuilder_CDocBuilder + * Method: c_Dispose + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilder_c_1Dispose + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro index 77cf4c19e3..ad1adbc549 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro @@ -29,10 +29,10 @@ core_mac:JAVA_ARCH = darwin INCLUDEPATH += $$JDK_PATH/include/$$JAVA_ARCH - - SOURCES += \ - docbuilder_CDocBuilderValue.cpp + docbuilder_CDocBuilderValue.cpp \ + docbuilder_CDocBuilder.cpp HEADERS += \ - docbuilder_CDocBuilderValue.h + docbuilder_CDocBuilderValue.h \ + docbuilder_CDocBuilder.h From 79309d3f026a275c87e102b0c9accf77d5c1df07 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Mon, 22 Jul 2024 17:09:48 +0400 Subject: [PATCH 05/26] Add Java code for `CDocBuilder` + Change private members to package-private --- .../src/java/docbuilder/CDocBuilder.java | 92 ++++++++++++++++++- .../src/java/docbuilder/CDocBuilderValue.java | 6 +- 2 files changed, 93 insertions(+), 5 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java index 2b2f33882d..09b618c7fa 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java @@ -1,10 +1,98 @@ package docbuilder; public class CDocBuilder { + public CDocBuilder() { + c_internal = c_Create(); + } - private long c_internal = 0; + protected void finalize() { + c_Destroy(c_internal); + } - // NATIVE METHODS: + public int openFile(String path, String params) { + return c_OpenFile(c_internal, path, params); + } + + public boolean createFile(int type) { + return c_CreateFileByType(c_internal, type); + } + + public boolean createFile(String extension) { + return c_CreateFileByExtension(c_internal, extension); + } + + public void setTmpFolder(String folder) { + c_SetTmpFolder(c_internal, folder); + } + + public int saveFile(int type, String path) { + return c_SaveFileByType(c_internal, type, path); + } + + public int saveFile(int type, String path, String params) { + return c_SaveFileByTypeWithParams(c_internal, type, path, params); + } + + public int saveFile(String extension, String path) { + return c_SaveFileByExtension(c_internal, extension, path); + } + + public int saveFile(String extension, String path, String params) { + return c_SaveFileByExtensionWithParams(c_internal, extension, path, params); + } + + public void closeFile() { + c_CloseFile(c_internal); + } + + public boolean executeCommand(String command) { + return c_ExecuteCommand(c_internal, command); + } + + public boolean executeCommand(String command, CDocBuilderValue retValue) { + return c_ExecuteCommandWithRetValue(c_internal, command, retValue.c_internal); + } + + public boolean run(String path) { + return c_Run(c_internal, path); + } + + public boolean runText(String commands) { + return c_RunText(c_internal, commands); + } + + public void setProperty(String param, String value) { + c_SetProperty(c_internal, param, value); + } + + public void writeData(String path, String value, boolean append) { + c_WriteData(c_internal, path, value, append); + } + + public boolean isSaveWithDoctrendererMode() { + return c_IsSaveWithDoctrendererMode(c_internal); + } + + public String getVersion() { + return c_GetVersion(c_internal); + } + + public CDocBuilderContext getContext() { + return new CDocBuilderContext(c_GetContext(c_internal)); + } + + public static void initialize() { + c_Initialize(); + } + + public static void dispose() { + c_Dispose(); + } + + + long c_internal = 0; + + // Native static methods private static native long c_Create(); private static native void c_Destroy(long self); diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java index e520598ac4..e4a7fe8874 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java @@ -5,7 +5,7 @@ public class CDocBuilderValue { c_internal = c_Create(); } - private CDocBuilderValue(long internal) { + CDocBuilderValue(long internal) { c_internal = internal; } @@ -174,9 +174,9 @@ public class CDocBuilderValue { } - private long c_internal = 0; + long c_internal = 0; - // NATIVE METHODS: + // Native static methods private static native long c_Create(); private static native long c_Copy(long other); private static native void c_Destroy(long self); From 6ab0d9d106f901cb37dede3c5c8c97285c1d6743 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Mon, 22 Jul 2024 21:31:27 +0400 Subject: [PATCH 06/26] Fixes in Java code --- .../docbuilder.java/src/java/docbuilder/CDocBuilder.java | 9 ++++++++- .../src/java/docbuilder/CDocBuilderValue.java | 5 ++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java index 09b618c7fa..2afbb5a6f8 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java @@ -85,14 +85,21 @@ public class CDocBuilder { c_Initialize(); } + public static void initialize(String directory) { + c_InitializeWithDirectory(directory); + } + public static void dispose() { c_Dispose(); } + // Native code + static { + System.loadLibrary("docbuilder.jni"); + } long c_internal = 0; - // Native static methods private static native long c_Create(); private static native void c_Destroy(long self); diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java index e4a7fe8874..f57bc057d0 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java @@ -173,10 +173,13 @@ public class CDocBuilderValue { return new CDocBuilderValue(c_Call6(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal, p4.c_internal, p5.c_internal, p6.c_internal)); } + // Native code + static { + System.loadLibrary("docbuilder.jni"); + } long c_internal = 0; - // Native static methods private static native long c_Create(); private static native long c_Copy(long other); private static native void c_Destroy(long self); From 3fd5b5612bacdfda57daf2d4c6b3d847c0aa4aea Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 23 Jul 2024 17:32:51 +0400 Subject: [PATCH 07/26] Add test Java example --- .../doctrenderer/docbuilder.java/make.py | 24 +++++++++++++++++++ .../java/docbuilder/CDocBuilderContext.java | 13 ++++++++++ .../docbuilder/CDocBuilderContextScope.java | 13 ++++++++++ .../src/java/docbuilder/FileTypes.java | 5 ++++ .../docbuilder.java/test/Program.java | 18 ++++++++++++++ .../docbuilder.java/test/make_test.py | 23 ++++++++++++++++++ 6 files changed, 96 insertions(+) create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/make.py create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/FileTypes.java create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/test/Program.java create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py diff --git a/DesktopEditor/doctrenderer/docbuilder.java/make.py b/DesktopEditor/doctrenderer/docbuilder.java/make.py new file mode 100644 index 0000000000..12c575c89b --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/make.py @@ -0,0 +1,24 @@ +import os +import argparse + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Build Java wrapper for docbuilder library') + parser.add_argument('-H', '--headers', action='store_true', help='Generate C++ JNI header files') + parser.add_argument('-jar', '--jar', action='store_true', help='Build into JAR archive') + args = parser.parse_args() + + file_dir = os.path.dirname(os.path.realpath(__file__)); + os.chdir(file_dir + '/src/java') + + java_files = '' + for file in os.listdir('docbuilder'): + if file.endswith('.java'): + java_files += ' docbuilder/' + file + + if args.jar: + # TODO + print('JAR build is not supported yet :(') + else: + classes_dir = file_dir + '/build/classes' + headers_dir = file_dir + '/src/jni' + os.system('javac -d ' + classes_dir + (' -h ' + headers_dir if args.headers else '') + java_files) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java new file mode 100644 index 0000000000..659b70fb5f --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java @@ -0,0 +1,13 @@ +package docbuilder; + +public class CDocBuilderContext { + public CDocBuilderContext() { + c_internal = 0; + } + + CDocBuilderContext(long internal) { + c_internal = internal; + } + + long c_internal = 0; +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java new file mode 100644 index 0000000000..c23482797e --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java @@ -0,0 +1,13 @@ +package docbuilder; + +public class CDocBuilderContextScope { + public CDocBuilderContextScope() { + c_internal = 0; + } + + CDocBuilderContextScope(long internal) { + c_internal = internal; + } + + long c_internal = 0; +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/FileTypes.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/FileTypes.java new file mode 100644 index 0000000000..9fac49f865 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/FileTypes.java @@ -0,0 +1,5 @@ +package docbuilder; + +public class FileTypes { + public static final int K = 42; +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java new file mode 100644 index 0000000000..1fb4fb32ff --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java @@ -0,0 +1,18 @@ +import docbuilder.CDocBuilder; + +public class Program { + public static void main(String[] args) { + test(); + + // Need to explicitly call System.gc() because finalizers might not automatically get called + // Note: Even System.gc() can not guarantee that finalizers will be actually called. Possible memory leaks! + System.gc(); + } + + public static void test() { + CDocBuilder.initialize("C:\\Users\\mixa_\\main\\core\\build\\lib\\win_64\\debug"); + CDocBuilder builder = new CDocBuilder(); + System.out.println(builder.getVersion()); + CDocBuilder.dispose(); + } +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py new file mode 100644 index 0000000000..6a87cd1562 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py @@ -0,0 +1,23 @@ +import os +import argparse +import platform + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Build and run the test example for docbuilder Java wrapper') + parser.add_argument('-r', '--run', dest='builder_dir', metavar='', help='Run the test example with specified docbuilder directory') + args = parser.parse_args() + + file_dir = os.path.dirname(os.path.realpath(__file__)); + os.chdir(file_dir) + + java_file = 'Program.java' + + if not args.builder_dir: + os.system('javac -d build/classes -cp ../build/classes ' + java_file) + else: + os_name = platform.system().lower() + builder_dir = args.builder_dir + if 'windows' == os_name: + # to load dependent libraries + os.environ['PATH'] = builder_dir + os.pathsep + os.environ['PATH'] + os.system('java -cp ../build/classes' + os.pathsep + 'build/classes -Djava.library.path=\"' + builder_dir + '\" Program') From c056c14303b14133914668ab9f7412b842fae66c Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 23 Jul 2024 18:15:39 +0400 Subject: [PATCH 08/26] Add hint how to run compiled Java example --- .../doctrenderer/docbuilder.java/test/make_test.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py index 6a87cd1562..0444d17346 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py @@ -12,12 +12,18 @@ if __name__ == "__main__": java_file = 'Program.java' - if not args.builder_dir: - os.system('javac -d build/classes -cp ../build/classes ' + java_file) - else: + if args.builder_dir: os_name = platform.system().lower() builder_dir = args.builder_dir if 'windows' == os_name: # to load dependent libraries os.environ['PATH'] = builder_dir + os.pathsep + os.environ['PATH'] os.system('java -cp ../build/classes' + os.pathsep + 'build/classes -Djava.library.path=\"' + builder_dir + '\" Program') + else: + os.system('javac -d build/classes -cp ../build/classes ' + java_file) + print('Program was built successfully') + print('Run it with: java -cp \"../build/classes' + os.pathsep + 'build/classes\" -D\"java.library.path\"=\"path_to_docbuilder\" Program') + os_name = platform.system().lower() + if 'windows' == os_name: + print('NOTE: You may need to add \"path_to_docbuilder\" to your PATH to load dependent libraries') + print('Or just run: python make_test.py --run \"path_to_docbuilder\"') From 58b5417ab4d7ac24ebc75723386b6782011a4cab Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 23 Jul 2024 19:10:08 +0400 Subject: [PATCH 09/26] Add class `CDocBuilderContextScope` to Java and JNI --- .../docbuilder/CDocBuilderContextScope.java | 25 ++++++++++- .../docbuilder_CDocBuilderContextScope.cpp | 28 ++++++++++++ .../jni/docbuilder_CDocBuilderContextScope.h | 45 +++++++++++++++++++ .../src/jni/docbuilder_jni.pro | 6 ++- 4 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.cpp create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.h diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java index c23482797e..9629a57fa4 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java @@ -2,12 +2,35 @@ package docbuilder; public class CDocBuilderContextScope { public CDocBuilderContextScope() { - c_internal = 0; + c_internal = c_Create(); + } + + public CDocBuilderContextScope(CDocBuilderContextScope other) { + c_internal = c_Copy(other.c_internal); + } + + protected void finalize() { + c_Destroy(c_internal); + } + + public void close() { + c_Close(c_internal); } CDocBuilderContextScope(long internal) { c_internal = internal; } + // Native code + static { + System.loadLibrary("docbuilder.jni"); + } + long c_internal = 0; + + private static native long c_Create(); + private static native long c_Copy(long other); + private static native void c_Destroy(long self); + + private static native void c_Close(long self); } diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.cpp b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.cpp new file mode 100644 index 0000000000..1e2dd62763 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.cpp @@ -0,0 +1,28 @@ +#include "docbuilder_CDocBuilderContextScope.h" + +#include "docbuilder.h" + +using namespace NSDoctRenderer; + +jlong Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Create(JNIEnv* env, jclass cls) +{ + return reinterpret_cast(new CDocBuilderContextScope()); +} + +jlong Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Copy(JNIEnv* env, jclass cls, jlong other) +{ + CDocBuilderContextScope* pOther = reinterpret_cast(other); + return reinterpret_cast(new CDocBuilderContextScope(*pOther)); +} + +void Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Destroy(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilderContextScope* pSelf = reinterpret_cast(self); + delete pSelf; +} + +void Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Close(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilderContextScope* pSelf = reinterpret_cast(self); + pSelf->Close(); +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.h b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.h new file mode 100644 index 0000000000..bcf6fe5e5f --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.h @@ -0,0 +1,45 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class docbuilder_CDocBuilderContextScope */ + +#ifndef _Included_docbuilder_CDocBuilderContextScope +#define _Included_docbuilder_CDocBuilderContextScope +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: docbuilder_CDocBuilderContextScope + * Method: CDocBuilderContextScope_Create + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Create + (JNIEnv *, jclass); + +/* + * Class: docbuilder_CDocBuilderContextScope + * Method: CDocBuilderContextScope_Copy + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Copy + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilderContextScope + * Method: CDocBuilderContextScope_Destroy + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Destroy + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilderContextScope + * Method: CDocBuilderContextScope_Close + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Close + (JNIEnv *, jclass, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro index ad1adbc549..d2ea967bd7 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro @@ -31,8 +31,10 @@ INCLUDEPATH += $$JDK_PATH/include/$$JAVA_ARCH SOURCES += \ docbuilder_CDocBuilderValue.cpp \ - docbuilder_CDocBuilder.cpp + docbuilder_CDocBuilder.cpp \ + docbuilder_CDocBuilderContextScope.cpp HEADERS += \ docbuilder_CDocBuilderValue.h \ - docbuilder_CDocBuilder.h + docbuilder_CDocBuilder.h \ + docbuilder_CDocBuilderContextScope.h From cc61536a9068cdf13db1075e16fcd01cdefe7d3d Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 23 Jul 2024 19:36:01 +0400 Subject: [PATCH 10/26] Fix function naming for `CDocBuilderContextScope` --- .../java/docbuilder/CDocBuilderContextScope.java | 8 ++++---- .../jni/docbuilder_CDocBuilderContextScope.cpp | 8 ++++---- .../src/jni/docbuilder_CDocBuilderContextScope.h | 16 ++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java index 9629a57fa4..8f778426b1 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java @@ -5,6 +5,10 @@ public class CDocBuilderContextScope { c_internal = c_Create(); } + CDocBuilderContextScope(long internal) { + c_internal = internal; + } + public CDocBuilderContextScope(CDocBuilderContextScope other) { c_internal = c_Copy(other.c_internal); } @@ -17,10 +21,6 @@ public class CDocBuilderContextScope { c_Close(c_internal); } - CDocBuilderContextScope(long internal) { - c_internal = internal; - } - // Native code static { System.loadLibrary("docbuilder.jni"); diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.cpp b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.cpp index 1e2dd62763..c63c69ae48 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.cpp @@ -4,24 +4,24 @@ using namespace NSDoctRenderer; -jlong Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Create(JNIEnv* env, jclass cls) +jlong Java_docbuilder_CDocBuilderContextScope_c_1Create(JNIEnv* env, jclass cls) { return reinterpret_cast(new CDocBuilderContextScope()); } -jlong Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Copy(JNIEnv* env, jclass cls, jlong other) +jlong Java_docbuilder_CDocBuilderContextScope_c_1Copy(JNIEnv* env, jclass cls, jlong other) { CDocBuilderContextScope* pOther = reinterpret_cast(other); return reinterpret_cast(new CDocBuilderContextScope(*pOther)); } -void Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Destroy(JNIEnv* env, jclass cls, jlong self) +void Java_docbuilder_CDocBuilderContextScope_c_1Destroy(JNIEnv* env, jclass cls, jlong self) { CDocBuilderContextScope* pSelf = reinterpret_cast(self); delete pSelf; } -void Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Close(JNIEnv* env, jclass cls, jlong self) +void Java_docbuilder_CDocBuilderContextScope_c_1Close(JNIEnv* env, jclass cls, jlong self) { CDocBuilderContextScope* pSelf = reinterpret_cast(self); pSelf->Close(); diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.h b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.h index bcf6fe5e5f..3ead55b861 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.h +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContextScope.h @@ -9,34 +9,34 @@ extern "C" { #endif /* * Class: docbuilder_CDocBuilderContextScope - * Method: CDocBuilderContextScope_Create + * Method: c_Create * Signature: ()J */ -JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Create +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContextScope_c_1Create (JNIEnv *, jclass); /* * Class: docbuilder_CDocBuilderContextScope - * Method: CDocBuilderContextScope_Copy + * Method: c_Copy * Signature: (J)J */ -JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Copy +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContextScope_c_1Copy (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderContextScope - * Method: CDocBuilderContextScope_Destroy + * Method: c_Destroy * Signature: (J)V */ -JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Destroy +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderContextScope_c_1Destroy (JNIEnv *, jclass, jlong); /* * Class: docbuilder_CDocBuilderContextScope - * Method: CDocBuilderContextScope_Close + * Method: c_Close * Signature: (J)V */ -JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderContextScope_CDocBuilderContextScope_1Close +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderContextScope_c_1Close (JNIEnv *, jclass, jlong); #ifdef __cplusplus From 666d62239e4bf3f6a1c62e02373f0a97b6c31474 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 23 Jul 2024 19:36:49 +0400 Subject: [PATCH 11/26] Add class `CDocBuilderContext` to Java and JNI --- .../java/docbuilder/CDocBuilderContext.java | 58 +++++++++++- .../src/jni/docbuilder_CDocBuilderContext.cpp | 64 +++++++++++++ .../src/jni/docbuilder_CDocBuilderContext.h | 93 +++++++++++++++++++ .../src/jni/docbuilder_jni.pro | 6 +- 4 files changed, 218 insertions(+), 3 deletions(-) create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContext.cpp create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContext.h diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java index 659b70fb5f..be744bdad6 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java @@ -2,12 +2,68 @@ package docbuilder; public class CDocBuilderContext { public CDocBuilderContext() { - c_internal = 0; + c_internal = c_Create(); } CDocBuilderContext(long internal) { c_internal = internal; } + public CDocBuilderContext(CDocBuilderContext other) { + c_internal = c_Copy(other.c_internal); + } + + protected void finalize() { + c_Destroy(c_internal); + } + + public CDocBuilderValue createUndefined() { + return new CDocBuilderValue(c_CreateUndefined(c_internal)); + } + + public CDocBuilderValue createNull() { + return new CDocBuilderValue(c_CreateNull(c_internal)); + } + + public CDocBuilderValue createObject() { + return new CDocBuilderValue(c_CreateObject(c_internal)); + } + + public CDocBuilderValue createArray(int length) { + return new CDocBuilderValue(c_CreateArray(c_internal, length)); + } + + public CDocBuilderValue getGlobal() { + return new CDocBuilderValue(c_GetGlobal(c_internal)); + } + + public CDocBuilderContextScope createScope() { + return new CDocBuilderContextScope(c_CreateScope(c_internal)); + } + + public boolean isError() { + return c_IsError(c_internal); + } + + // Native code + static { + System.loadLibrary("docbuilder.jni"); + } + long c_internal = 0; + + private static native long c_Create(); + private static native long c_Copy(long other); + private static native void c_Destroy(long self); + + private static native long c_CreateUndefined(long self); + private static native long c_CreateNull(long self); + private static native long c_CreateObject(long self); + private static native long c_CreateArray(long self, int length); + + private static native long c_GetGlobal(long self); + + private static native long c_CreateScope(long self); + + private static native boolean c_IsError(long self); } diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContext.cpp b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContext.cpp new file mode 100644 index 0000000000..8398d14c37 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContext.cpp @@ -0,0 +1,64 @@ +#include "docbuilder_CDocBuilderContext.h" + +#include "docbuilder.h" + +using namespace NSDoctRenderer; + +jlong Java_docbuilder_CDocBuilderContext_c_1Create(JNIEnv* env, jclass cls) +{ + return reinterpret_cast(new CDocBuilderContext()); +} + +jlong Java_docbuilder_CDocBuilderContext_c_1Copy(JNIEnv* env, jclass cls, jlong other) +{ + CDocBuilderContext* pOther = reinterpret_cast(other); + return reinterpret_cast(new CDocBuilderContext(*pOther)); +} + +void Java_docbuilder_CDocBuilderContext_c_1Destroy(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilderContext* pSelf = reinterpret_cast(self); + delete pSelf; +} + +jlong Java_docbuilder_CDocBuilderContext_c_1CreateUndefined(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilderContext* pSelf = reinterpret_cast(self); + return reinterpret_cast(new CDocBuilderValue(pSelf->CreateUndefined())); +} + +jlong Java_docbuilder_CDocBuilderContext_c_1CreateNull(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilderContext* pSelf = reinterpret_cast(self); + return reinterpret_cast(new CDocBuilderValue(pSelf->CreateNull())); +} + +jlong Java_docbuilder_CDocBuilderContext_c_1CreateObject(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilderContext* pSelf = reinterpret_cast(self); + return reinterpret_cast(new CDocBuilderValue(pSelf->CreateObject())); +} + +jlong Java_docbuilder_CDocBuilderContext_c_1CreateArray(JNIEnv* env, jclass cls, jlong self, jint length) +{ + CDocBuilderContext* pSelf = reinterpret_cast(self); + return reinterpret_cast(new CDocBuilderValue(pSelf->CreateArray((int)length))); +} + +jlong Java_docbuilder_CDocBuilderContext_c_1GetGlobal(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilderContext* pSelf = reinterpret_cast(self); + return reinterpret_cast(new CDocBuilderValue(pSelf->GetGlobal())); +} + +jlong Java_docbuilder_CDocBuilderContext_c_1CreateScope(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilderContext* pSelf = reinterpret_cast(self); + return reinterpret_cast(new CDocBuilderContextScope(pSelf->CreateScope())); +} + +jboolean Java_docbuilder_CDocBuilderContext_c_1IsError(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilderContext* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsError(); +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContext.h b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContext.h new file mode 100644 index 0000000000..43e72ee4f1 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderContext.h @@ -0,0 +1,93 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class docbuilder_CDocBuilderContext */ + +#ifndef _Included_docbuilder_CDocBuilderContext +#define _Included_docbuilder_CDocBuilderContext +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: docbuilder_CDocBuilderContext + * Method: c_Create + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContext_c_1Create + (JNIEnv *, jclass); + +/* + * Class: docbuilder_CDocBuilderContext + * Method: c_Copy + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContext_c_1Copy + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilderContext + * Method: c_Destroy + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_docbuilder_CDocBuilderContext_c_1Destroy + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilderContext + * Method: c_CreateUndefined + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContext_c_1CreateUndefined + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilderContext + * Method: c_CreateNull + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContext_c_1CreateNull + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilderContext + * Method: c_CreateObject + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContext_c_1CreateObject + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilderContext + * Method: c_CreateArray + * Signature: (JI)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContext_c_1CreateArray + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: docbuilder_CDocBuilderContext + * Method: c_GetGlobal + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContext_c_1GetGlobal + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilderContext + * Method: c_CreateScope + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_docbuilder_CDocBuilderContext_c_1CreateScope + (JNIEnv *, jclass, jlong); + +/* + * Class: docbuilder_CDocBuilderContext + * Method: c_IsError + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderContext_c_1IsError + (JNIEnv *, jclass, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro index d2ea967bd7..6fe624560f 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_jni.pro @@ -32,9 +32,11 @@ INCLUDEPATH += $$JDK_PATH/include/$$JAVA_ARCH SOURCES += \ docbuilder_CDocBuilderValue.cpp \ docbuilder_CDocBuilder.cpp \ - docbuilder_CDocBuilderContextScope.cpp + docbuilder_CDocBuilderContextScope.cpp \ + docbuilder_CDocBuilderContext.cpp HEADERS += \ docbuilder_CDocBuilderValue.h \ docbuilder_CDocBuilder.h \ - docbuilder_CDocBuilderContextScope.h + docbuilder_CDocBuilderContextScope.h \ + docbuilder_CDocBuilderContext.h From 01916b7de61ca910800ee97e703e3c8d6e134726 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 23 Jul 2024 19:49:14 +0400 Subject: [PATCH 12/26] Add file type constants --- .../src/java/docbuilder/FileTypes.java | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/FileTypes.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/FileTypes.java index 9fac49f865..138248181b 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/FileTypes.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/FileTypes.java @@ -1,5 +1,47 @@ package docbuilder; public class FileTypes { - public static final int K = 42; + public class Document { + private static final int MASK = 0x0040; + public static final int DOCX = MASK + 0x0001; + public static final int DOC = MASK + 0x0002; + public static final int ODT = MASK + 0x0003; + public static final int RTF = MASK + 0x0004; + public static final int TXT = MASK + 0x0005; + public static final int DOTX = MASK + 0x000c; + public static final int OTT = MASK + 0x000f; + public static final int HTML = MASK + 0x0012; + public static final int OFORM_PDF = MASK + 0x0017; + } + + public class Presentation { + private static final int MASK = 0x0080; + public static final int PPTX = MASK + 0x0001; + public static final int PPT = MASK + 0x0002; + public static final int ODP = MASK + 0x0003; + public static final int PPSX = MASK + 0x0004; + public static final int POTX = MASK + 0x0007; + public static final int OTP = MASK + 0x000a; + } + + public class Spreadsheet { + private static final int MASK = 0x0100; + public static final int XLSX = MASK + 0x0001; + public static final int XLS = MASK + 0x0002; + public static final int ODS = MASK + 0x0003; + public static final int CSV = MASK + 0x0004; + public static final int XLTX = MASK + 0x0006; + public static final int OTS = MASK + 0x0009; + } + + public class Graphics { + private static final int PDF_MASK = 0x0200; + public static final int PDF = PDF_MASK + 0x0001; + public static final int PDFA = PDF_MASK + 0x0009; + + private static final int IMAGE_MASK = 0x0400; + public static final int JPG = IMAGE_MASK + 0x0001; + public static final int PNG = IMAGE_MASK + 0x0005; + public static final int BMP = IMAGE_MASK + 0x0008; + } } From f9d6b49a0512d9f45720841e81f22edb0354f32b Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 23 Jul 2024 20:31:43 +0400 Subject: [PATCH 13/26] Rename Call() to call() --- .../src/java/docbuilder/CDocBuilderValue.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java index f57bc057d0..588b24fc35 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java @@ -145,31 +145,31 @@ public class CDocBuilderValue { return new CDocBuilderValue(c_CreateArray(length)); } - public CDocBuilderValue Call(String name) { + public CDocBuilderValue call(String name) { return new CDocBuilderValue(c_Call0(c_internal, name)); } - public CDocBuilderValue Call(String name, CDocBuilderValue p1) { + public CDocBuilderValue call(String name, CDocBuilderValue p1) { return new CDocBuilderValue(c_Call1(c_internal, name, p1.c_internal)); } - public CDocBuilderValue Call(String name, CDocBuilderValue p1, CDocBuilderValue p2) { + public CDocBuilderValue call(String name, CDocBuilderValue p1, CDocBuilderValue p2) { return new CDocBuilderValue(c_Call2(c_internal, name, p1.c_internal, p2.c_internal)); } - public CDocBuilderValue Call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3) { + public CDocBuilderValue call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3) { return new CDocBuilderValue(c_Call3(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal)); } - public CDocBuilderValue Call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4) { + public CDocBuilderValue call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4) { return new CDocBuilderValue(c_Call4(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal, p4.c_internal)); } - public CDocBuilderValue Call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5) { + public CDocBuilderValue call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5) { return new CDocBuilderValue(c_Call5(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal, p4.c_internal, p5.c_internal)); } - public CDocBuilderValue Call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5, CDocBuilderValue p6) { + public CDocBuilderValue call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5, CDocBuilderValue p6) { return new CDocBuilderValue(c_Call6(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal, p4.c_internal, p5.c_internal, p6.c_internal)); } From 7d0683e33892e63cf304791e5001dfc90e1a944a Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 23 Jul 2024 20:32:44 +0400 Subject: [PATCH 14/26] Update test example (it doesn't work yet) --- .../docbuilder.java/test/Program.java | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java index 1fb4fb32ff..e2d3a2a41e 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java @@ -1,18 +1,49 @@ -import docbuilder.CDocBuilder; +import docbuilder.*; public class Program { public static void main(String[] args) { - test(); + String workDirectory = "C:/Program Files/ONLYOFFICE/DocumentBuilder"; + String resultPath = "result.docx"; + + // TODO: Update system PATH at runtime + + test(workDirectory, resultPath); // Need to explicitly call System.gc() because finalizers might not automatically get called // Note: Even System.gc() can not guarantee that finalizers will be actually called. Possible memory leaks! System.gc(); } - public static void test() { - CDocBuilder.initialize("C:\\Users\\mixa_\\main\\core\\build\\lib\\win_64\\debug"); + public static void test(String workDirectory, String resultPath) { + CDocBuilder.initialize(workDirectory); CDocBuilder builder = new CDocBuilder(); - System.out.println(builder.getVersion()); + builder.createFile(FileTypes.Document.DOCX); + + CDocBuilderContext context = builder.getContext(); + CDocBuilderContextScope scope = context.createScope(); + + CDocBuilderValue global = context.getGlobal(); + + CDocBuilderValue api = global.get("Api"); + CDocBuilderValue document = api.call("GetDocument"); + CDocBuilderValue paragraph1 = api.call("CreateParagraph"); + + // TODO: autowrapping? + paragraph1.call("SetSpacingAfter", new CDocBuilderValue(1000), new CDocBuilderValue(false)); + paragraph1.call("AddText", new CDocBuilderValue("Hello from Java!")); + + CDocBuilderValue paragraph2 = api.call("CreateParagraph"); + paragraph2.call("AddText", new CDocBuilderValue("Goodbye!")); + + CDocBuilderValue content = context.createArray(2); + content.set(0, paragraph1); + content.set(1, paragraph1); + + document.call("InsertContent", content); + + builder.saveFile(FileTypes.Document.DOCX, resultPath); + builder.closeFile(); + CDocBuilder.dispose(); } } From abaaa54bc2a5e08db2490e20bd9bfb24072b39ad Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Wed, 24 Jul 2024 14:05:29 +0400 Subject: [PATCH 15/26] Fix SetByIndex and test example (now it does work) --- .../docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp | 2 +- DesktopEditor/doctrenderer/docbuilder.java/test/Program.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp index 887497c17a..cfb3099ea9 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp @@ -147,7 +147,7 @@ void Java_docbuilder_CDocBuilderValue_c_1SetByIndex(JNIEnv* env, jclass cls, jlo { CDocBuilderValue* pSelf = reinterpret_cast(self); CDocBuilderValue* pValue = reinterpret_cast(value); - pSelf->Set((int)index, pValue); + pSelf->Set((int)index, *pValue); } jlong Java_docbuilder_CDocBuilderValue_c_1CreateWithBool(JNIEnv* env, jclass cls, jboolean value) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java index e2d3a2a41e..59987e29f3 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java @@ -37,7 +37,7 @@ public class Program { CDocBuilderValue content = context.createArray(2); content.set(0, paragraph1); - content.set(1, paragraph1); + content.set(1, paragraph2); document.call("InsertContent", content); From f2acef6bb209f9d018953693f412a2b92c7046d3 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Thu, 25 Jul 2024 20:06:11 +0400 Subject: [PATCH 16/26] Add `docbuilder.utils.Utils` class to edit PATH on Windows --- .../doctrenderer/docbuilder.java/make.py | 5 +++ .../src/java/docbuilder/utils/Utils.java | 9 ++++++ .../src/jni/utils/docbuilder_jni_utils.pro | 31 +++++++++++++++++++ .../src/jni/utils/docbuilder_utils_Utils.cpp | 16 ++++++++++ .../src/jni/utils/docbuilder_utils_Utils.h | 21 +++++++++++++ .../docbuilder.java/test/Program.java | 2 +- .../docbuilder.java/test/make_test.py | 7 ----- 7 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/Utils.java create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_jni_utils.pro create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.cpp create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.h diff --git a/DesktopEditor/doctrenderer/docbuilder.java/make.py b/DesktopEditor/doctrenderer/docbuilder.java/make.py index 12c575c89b..70a8f88aed 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/make.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/make.py @@ -15,10 +15,15 @@ if __name__ == "__main__": if file.endswith('.java'): java_files += ' docbuilder/' + file + java_utils_files = ' docbuilder/utils/Utils.java' + if args.jar: # TODO print('JAR build is not supported yet :(') else: classes_dir = file_dir + '/build/classes' headers_dir = file_dir + '/src/jni' + # build all main Java classes os.system('javac -d ' + classes_dir + (' -h ' + headers_dir if args.headers else '') + java_files) + # build class from utils + os.system('javac -d ' + classes_dir + (' -h ' + headers_dir + '/utils' if args.headers else '') + java_utils_files) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/Utils.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/Utils.java new file mode 100644 index 0000000000..91df023c98 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/Utils.java @@ -0,0 +1,9 @@ +package docbuilder.utils; + +public class Utils { + static { + System.loadLibrary("docbuilder.jni_utils"); + } + + public static native void addToPath(String directory); +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_jni_utils.pro b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_jni_utils.pro new file mode 100644 index 0000000000..c44349fd7d --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_jni_utils.pro @@ -0,0 +1,31 @@ +QT -= core +QT -= gui + +TARGET = docbuilder.jni_utils + +TEMPLATE = lib + +CONFIG += shared +CONFIG += plugin + +CORE_ROOT_DIR = $$PWD/../../../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/Common/base.pri) + +# Specify JDK path here +JDK_PATH = "C:/Program Files/Java/jdk-22" + +INCLUDEPATH += $$JDK_PATH/include + +core_windows:JAVA_ARCH = win32 +core_linux:JAVA_ARCH = linux +core_mac:JAVA_ARCH = darwin + +INCLUDEPATH += $$JDK_PATH/include/$$JAVA_ARCH + +SOURCES += \ + docbuilder_utils_Utils.cpp + +HEADERS += \ + docbuilder_utils_Utils.h diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.cpp b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.cpp new file mode 100644 index 0000000000..d6e967dfd5 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.cpp @@ -0,0 +1,16 @@ +#include "docbuilder_utils_Utils.h" + +#include +#include + +void Java_docbuilder_utils_Utils_addToPath(JNIEnv* env, jclass cls, jstring directory) +{ +#ifdef _WIN32 + const char* strUtfDirectory = env->GetStringUTFChars(directory, nullptr); + std::string sPath(getenv("PATH")); + sPath += ';'; + sPath += strUtfDirectory; + _putenv_s("PATH", sPath.c_str()); + env->ReleaseStringUTFChars(directory, strUtfDirectory); +#endif +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.h b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.h new file mode 100644 index 0000000000..d77dd2d946 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class docbuilder_utils_Utils */ + +#ifndef _Included_docbuilder_utils_Utils +#define _Included_docbuilder_utils_Utils +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: docbuilder_utils_Utils + * Method: addToPath + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_docbuilder_utils_Utils_addToPath + (JNIEnv *, jclass, jstring); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java index 59987e29f3..2057f35299 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java @@ -5,7 +5,7 @@ public class Program { String workDirectory = "C:/Program Files/ONLYOFFICE/DocumentBuilder"; String resultPath = "result.docx"; - // TODO: Update system PATH at runtime + docbuilder.utils.Utils.addToPath(workDirectory); test(workDirectory, resultPath); diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py index 0444d17346..b779a1096d 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py @@ -13,17 +13,10 @@ if __name__ == "__main__": java_file = 'Program.java' if args.builder_dir: - os_name = platform.system().lower() builder_dir = args.builder_dir - if 'windows' == os_name: - # to load dependent libraries - os.environ['PATH'] = builder_dir + os.pathsep + os.environ['PATH'] os.system('java -cp ../build/classes' + os.pathsep + 'build/classes -Djava.library.path=\"' + builder_dir + '\" Program') else: os.system('javac -d build/classes -cp ../build/classes ' + java_file) print('Program was built successfully') print('Run it with: java -cp \"../build/classes' + os.pathsep + 'build/classes\" -D\"java.library.path\"=\"path_to_docbuilder\" Program') - os_name = platform.system().lower() - if 'windows' == os_name: - print('NOTE: You may need to add \"path_to_docbuilder\" to your PATH to load dependent libraries') print('Or just run: python make_test.py --run \"path_to_docbuilder\"') From 234def9cd7a59add9a7a301cba13be51fd50f5a2 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 26 Jul 2024 19:10:32 +0400 Subject: [PATCH 17/26] Autowrap function arguments + Add constructor from Java arrays --- .../src/java/docbuilder/CDocBuilderValue.java | 86 +++++++++++++++---- .../docbuilder.java/test/Program.java | 12 ++- 2 files changed, 73 insertions(+), 25 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java index 588b24fc35..a9578401f4 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java @@ -105,16 +105,19 @@ public class CDocBuilderValue { return new CDocBuilderValue(c_GetByIndex(c_internal, index)); } - public void setProperty(String name, CDocBuilderValue value) { - c_SetProperty(c_internal, name, value.c_internal); + public void setProperty(String name, Object value) { + CDocBuilderValue docBuilderValue = getValueFromObject(value); + c_SetProperty(c_internal, name, docBuilderValue.c_internal); } - public void set(String name, CDocBuilderValue value) { - c_SetProperty(c_internal, name, value.c_internal); + public void set(String name, Object value) { + CDocBuilderValue docBuilderValue = getValueFromObject(value); + c_SetProperty(c_internal, name, docBuilderValue.c_internal); } - public void set(int index, CDocBuilderValue value) { - c_SetByIndex(c_internal, index, value.c_internal); + public void set(int index, Object value) { + CDocBuilderValue docBuilderValue = getValueFromObject(value); + c_SetByIndex(c_internal, index, docBuilderValue.c_internal); } public CDocBuilderValue(boolean value) { @@ -133,6 +136,32 @@ public class CDocBuilderValue { c_internal = c_CreateWithString(value); } + public CDocBuilderValue(Object[] values) { + int length = values.length; + c_internal = c_CreateArray(length); + for (int i = 0; i < length; i++) { + this.set(i, getValueFromObject(values[i])); + } + } + + static CDocBuilderValue getValueFromObject(Object obj) { + if (obj instanceof CDocBuilderValue) { + return (CDocBuilderValue)obj; + } else if (obj instanceof Boolean) { + return new CDocBuilderValue((Boolean)obj); + } else if (obj instanceof Integer) { + return new CDocBuilderValue((Integer)obj); + } else if (obj instanceof Double) { + return new CDocBuilderValue((Double)obj); + } else if (obj instanceof String) { + return new CDocBuilderValue((String)obj); + } else if (obj instanceof Object[]) { + return new CDocBuilderValue((Object[])obj); + } else { + throw new IllegalArgumentException("Unsupported type for CDocBuilderValue"); + } + } + public static CDocBuilderValue createUndefined() { return new CDocBuilderValue(c_CreateUndefined()); } @@ -149,28 +178,49 @@ public class CDocBuilderValue { return new CDocBuilderValue(c_Call0(c_internal, name)); } - public CDocBuilderValue call(String name, CDocBuilderValue p1) { - return new CDocBuilderValue(c_Call1(c_internal, name, p1.c_internal)); + public CDocBuilderValue call(String name, Object p1) { + CDocBuilderValue pValue1 = getValueFromObject(p1); + return new CDocBuilderValue(c_Call1(c_internal, name, pValue1.c_internal)); } - public CDocBuilderValue call(String name, CDocBuilderValue p1, CDocBuilderValue p2) { - return new CDocBuilderValue(c_Call2(c_internal, name, p1.c_internal, p2.c_internal)); + public CDocBuilderValue call(String name, Object p1, Object p2) { + CDocBuilderValue pValue1 = getValueFromObject(p1); + CDocBuilderValue pValue2 = getValueFromObject(p2); + return new CDocBuilderValue(c_Call2(c_internal, name, pValue1.c_internal, pValue2.c_internal)); } - public CDocBuilderValue call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3) { - return new CDocBuilderValue(c_Call3(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal)); + public CDocBuilderValue call(String name, Object p1, Object p2, Object p3) { + CDocBuilderValue pValue1 = getValueFromObject(p1); + CDocBuilderValue pValue2 = getValueFromObject(p2); + CDocBuilderValue pValue3 = getValueFromObject(p3); + return new CDocBuilderValue(c_Call3(c_internal, name, pValue1.c_internal, pValue2.c_internal, pValue3.c_internal)); } - public CDocBuilderValue call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4) { - return new CDocBuilderValue(c_Call4(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal, p4.c_internal)); + public CDocBuilderValue call(String name, Object p1, Object p2, Object p3, Object p4) { + CDocBuilderValue pValue1 = getValueFromObject(p1); + CDocBuilderValue pValue2 = getValueFromObject(p2); + CDocBuilderValue pValue3 = getValueFromObject(p3); + CDocBuilderValue pValue4 = getValueFromObject(p4); + return new CDocBuilderValue(c_Call4(c_internal, name, pValue1.c_internal, pValue2.c_internal, pValue3.c_internal, pValue4.c_internal)); } - public CDocBuilderValue call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5) { - return new CDocBuilderValue(c_Call5(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal, p4.c_internal, p5.c_internal)); + public CDocBuilderValue call(String name, Object p1, Object p2, Object p3, Object p4, Object p5) { + CDocBuilderValue pValue1 = getValueFromObject(p1); + CDocBuilderValue pValue2 = getValueFromObject(p2); + CDocBuilderValue pValue3 = getValueFromObject(p3); + CDocBuilderValue pValue4 = getValueFromObject(p4); + CDocBuilderValue pValue5 = getValueFromObject(p5); + return new CDocBuilderValue(c_Call5(c_internal, name, pValue1.c_internal, pValue2.c_internal, pValue3.c_internal, pValue4.c_internal, pValue5.c_internal)); } - public CDocBuilderValue call(String name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5, CDocBuilderValue p6) { - return new CDocBuilderValue(c_Call6(c_internal, name, p1.c_internal, p2.c_internal, p3.c_internal, p4.c_internal, p5.c_internal, p6.c_internal)); + public CDocBuilderValue call(String name, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6) { + CDocBuilderValue pValue1 = getValueFromObject(p1); + CDocBuilderValue pValue2 = getValueFromObject(p2); + CDocBuilderValue pValue3 = getValueFromObject(p3); + CDocBuilderValue pValue4 = getValueFromObject(p4); + CDocBuilderValue pValue5 = getValueFromObject(p5); + CDocBuilderValue pValue6 = getValueFromObject(p6); + return new CDocBuilderValue(c_Call6(c_internal, name, pValue1.c_internal, pValue2.c_internal, pValue3.c_internal, pValue4.c_internal, pValue5.c_internal, pValue6.c_internal)); } // Native code diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java index 2057f35299..f112c7b779 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java @@ -28,16 +28,14 @@ public class Program { CDocBuilderValue document = api.call("GetDocument"); CDocBuilderValue paragraph1 = api.call("CreateParagraph"); - // TODO: autowrapping? - paragraph1.call("SetSpacingAfter", new CDocBuilderValue(1000), new CDocBuilderValue(false)); - paragraph1.call("AddText", new CDocBuilderValue("Hello from Java!")); + paragraph1.call("SetSpacingAfter", 1000, false); + paragraph1.call("AddText", "Hello from Java!"); CDocBuilderValue paragraph2 = api.call("CreateParagraph"); - paragraph2.call("AddText", new CDocBuilderValue("Goodbye!")); + paragraph2.call("AddText", "Goodbye!"); - CDocBuilderValue content = context.createArray(2); - content.set(0, paragraph1); - content.set(1, paragraph2); + CDocBuilderValue[] paragraphs = { paragraph1, paragraph2 }; + CDocBuilderValue content = new CDocBuilderValue(paragraphs); document.call("InsertContent", content); From 8b2d7035c13069b2ce1edd63a07ed4a0054135ed Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 26 Jul 2024 19:42:37 +0400 Subject: [PATCH 18/26] Add build to JAR --- .../doctrenderer/docbuilder.java/make.py | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/make.py b/DesktopEditor/doctrenderer/docbuilder.java/make.py index 70a8f88aed..36d2cb3cac 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/make.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/make.py @@ -17,13 +17,20 @@ if __name__ == "__main__": java_utils_files = ' docbuilder/utils/Utils.java' + # BUILD + classes_dir = file_dir + '/build/classes' + headers_dir = file_dir + '/src/jni' + # build all main Java classes + os.system('javac -d ' + classes_dir + (' -h ' + headers_dir if args.headers else '') + java_files) + # build class from utils + os.system('javac -d ' + classes_dir + (' -h ' + headers_dir + '/utils' if args.headers else '') + java_utils_files) + + # PACKING TO JAR if args.jar: - # TODO - print('JAR build is not supported yet :(') - else: - classes_dir = file_dir + '/build/classes' - headers_dir = file_dir + '/src/jni' - # build all main Java classes - os.system('javac -d ' + classes_dir + (' -h ' + headers_dir if args.headers else '') + java_files) - # build class from utils - os.system('javac -d ' + classes_dir + (' -h ' + headers_dir + '/utils' if args.headers else '') + java_utils_files) + os.chdir(classes_dir) + class_files = '' + for file in os.listdir('docbuilder'): + if file.endswith('.class'): + class_files += ' docbuilder/' + file + class_utils_files = ' docbuilder/utils/Utils.class' + os.system('jar -cvf ../libs/docbuilder.jar ' + class_files + class_utils_files) From 88b16607357f7fa7c1dcecfbd33c56abd385716a Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 30 Jul 2024 11:36:47 +0400 Subject: [PATCH 19/26] Add another way to load native libraries --- .../doctrenderer/docbuilder.java/make.py | 5 ++--- .../src/java/docbuilder/CDocBuilder.java | 2 +- .../java/docbuilder/CDocBuilderContext.java | 2 +- .../docbuilder/CDocBuilderContextScope.java | 2 +- .../src/java/docbuilder/CDocBuilderValue.java | 2 +- .../docbuilder/utils/NativeLibraryLoader.java | 18 ++++++++++++++++++ .../src/java/docbuilder/utils/Utils.java | 9 --------- .../docbuilder.java/test/Program.java | 2 -- 8 files changed, 24 insertions(+), 18 deletions(-) create mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java delete mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/Utils.java diff --git a/DesktopEditor/doctrenderer/docbuilder.java/make.py b/DesktopEditor/doctrenderer/docbuilder.java/make.py index 36d2cb3cac..9da926c4f9 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/make.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/make.py @@ -15,15 +15,14 @@ if __name__ == "__main__": if file.endswith('.java'): java_files += ' docbuilder/' + file - java_utils_files = ' docbuilder/utils/Utils.java' + java_utils_file = ' docbuilder/utils/NativeLibraryLoader.java' + java_files += java_utils_file # BUILD classes_dir = file_dir + '/build/classes' headers_dir = file_dir + '/src/jni' # build all main Java classes os.system('javac -d ' + classes_dir + (' -h ' + headers_dir if args.headers else '') + java_files) - # build class from utils - os.system('javac -d ' + classes_dir + (' -h ' + headers_dir + '/utils' if args.headers else '') + java_utils_files) # PACKING TO JAR if args.jar: diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java index 2afbb5a6f8..708c887837 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java @@ -95,7 +95,7 @@ public class CDocBuilder { // Native code static { - System.loadLibrary("docbuilder.jni"); + docbuilder.utils.NativeLibraryLoader.loadLibraries(); } long c_internal = 0; diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java index be744bdad6..68b199f3ee 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContext.java @@ -47,7 +47,7 @@ public class CDocBuilderContext { // Native code static { - System.loadLibrary("docbuilder.jni"); + docbuilder.utils.NativeLibraryLoader.loadLibraries(); } long c_internal = 0; diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java index 8f778426b1..e50742f35f 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderContextScope.java @@ -23,7 +23,7 @@ public class CDocBuilderContextScope { // Native code static { - System.loadLibrary("docbuilder.jni"); + docbuilder.utils.NativeLibraryLoader.loadLibraries(); } long c_internal = 0; diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java index a9578401f4..ba17a2ef53 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java @@ -225,7 +225,7 @@ public class CDocBuilderValue { // Native code static { - System.loadLibrary("docbuilder.jni"); + docbuilder.utils.NativeLibraryLoader.loadLibraries(); } long c_internal = 0; diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java new file mode 100644 index 0000000000..dcf8d3f526 --- /dev/null +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java @@ -0,0 +1,18 @@ +package docbuilder.utils; + +public class NativeLibraryLoader { + static { + System.loadLibrary("icudt58"); + System.loadLibrary("icuuc58"); + System.loadLibrary("UnicodeConverter"); + System.loadLibrary("kernel"); + System.loadLibrary("kernel_network"); + System.loadLibrary("graphics"); + System.loadLibrary("doctrenderer"); + System.loadLibrary("docbuilder.jni"); + } + + public static void loadLibraries() { + // No-op, just to force the class loading + } +} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/Utils.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/Utils.java deleted file mode 100644 index 91df023c98..0000000000 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/Utils.java +++ /dev/null @@ -1,9 +0,0 @@ -package docbuilder.utils; - -public class Utils { - static { - System.loadLibrary("docbuilder.jni_utils"); - } - - public static native void addToPath(String directory); -} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java index f112c7b779..09ca10747a 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java @@ -5,8 +5,6 @@ public class Program { String workDirectory = "C:/Program Files/ONLYOFFICE/DocumentBuilder"; String resultPath = "result.docx"; - docbuilder.utils.Utils.addToPath(workDirectory); - test(workDirectory, resultPath); // Need to explicitly call System.gc() because finalizers might not automatically get called From f02147b97ca226b2976a9cf13c93aadfd174d91e Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 30 Jul 2024 12:25:54 +0400 Subject: [PATCH 20/26] Fix jar build --- DesktopEditor/doctrenderer/docbuilder.java/make.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/make.py b/DesktopEditor/doctrenderer/docbuilder.java/make.py index 9da926c4f9..414f815073 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/make.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/make.py @@ -31,5 +31,6 @@ if __name__ == "__main__": for file in os.listdir('docbuilder'): if file.endswith('.class'): class_files += ' docbuilder/' + file - class_utils_files = ' docbuilder/utils/Utils.class' - os.system('jar -cvf ../libs/docbuilder.jar ' + class_files + class_utils_files) + class_utils_file = ' docbuilder/utils/NativeLibraryLoader.class' + class_files += class_utils_file + os.system('jar -cvf ../libs/docbuilder.jar ' + class_files) From 3221d20d81ed07e3eabebc48f190ab21615fb55e Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 2 Aug 2024 12:16:47 +0400 Subject: [PATCH 21/26] Remove docbuilder_jni_utils helper library --- .../docbuilder/utils/NativeLibraryLoader.java | 1 + .../src/jni/utils/docbuilder_jni_utils.pro | 31 ------------------- .../src/jni/utils/docbuilder_utils_Utils.cpp | 16 ---------- .../src/jni/utils/docbuilder_utils_Utils.h | 21 ------------- 4 files changed, 1 insertion(+), 68 deletions(-) delete mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_jni_utils.pro delete mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.cpp delete mode 100644 DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.h diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java index dcf8d3f526..6596cf3866 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java @@ -2,6 +2,7 @@ package docbuilder.utils; public class NativeLibraryLoader { static { + // TODO: name of icu libraries differ between systems. Handle that. System.loadLibrary("icudt58"); System.loadLibrary("icuuc58"); System.loadLibrary("UnicodeConverter"); diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_jni_utils.pro b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_jni_utils.pro deleted file mode 100644 index c44349fd7d..0000000000 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_jni_utils.pro +++ /dev/null @@ -1,31 +0,0 @@ -QT -= core -QT -= gui - -TARGET = docbuilder.jni_utils - -TEMPLATE = lib - -CONFIG += shared -CONFIG += plugin - -CORE_ROOT_DIR = $$PWD/../../../../../.. -PWD_ROOT_DIR = $$PWD - -include($$CORE_ROOT_DIR/Common/base.pri) - -# Specify JDK path here -JDK_PATH = "C:/Program Files/Java/jdk-22" - -INCLUDEPATH += $$JDK_PATH/include - -core_windows:JAVA_ARCH = win32 -core_linux:JAVA_ARCH = linux -core_mac:JAVA_ARCH = darwin - -INCLUDEPATH += $$JDK_PATH/include/$$JAVA_ARCH - -SOURCES += \ - docbuilder_utils_Utils.cpp - -HEADERS += \ - docbuilder_utils_Utils.h diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.cpp b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.cpp deleted file mode 100644 index d6e967dfd5..0000000000 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "docbuilder_utils_Utils.h" - -#include -#include - -void Java_docbuilder_utils_Utils_addToPath(JNIEnv* env, jclass cls, jstring directory) -{ -#ifdef _WIN32 - const char* strUtfDirectory = env->GetStringUTFChars(directory, nullptr); - std::string sPath(getenv("PATH")); - sPath += ';'; - sPath += strUtfDirectory; - _putenv_s("PATH", sPath.c_str()); - env->ReleaseStringUTFChars(directory, strUtfDirectory); -#endif -} diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.h b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.h deleted file mode 100644 index d77dd2d946..0000000000 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/utils/docbuilder_utils_Utils.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class docbuilder_utils_Utils */ - -#ifndef _Included_docbuilder_utils_Utils -#define _Included_docbuilder_utils_Utils -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: docbuilder_utils_Utils - * Method: addToPath - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_docbuilder_utils_Utils_addToPath - (JNIEnv *, jclass, jstring); - -#ifdef __cplusplus -} -#endif -#endif From 8d5fc7d6ca231ee3b8200c91c0f183f5a0c54c03 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 2 Aug 2024 15:58:13 +0400 Subject: [PATCH 22/26] Fix build for JDK 8 and force build into JAR --- .../doctrenderer/docbuilder.java/make.py | 15 ++++++++++++--- .../docbuilder.java/test/make_test.py | 7 +++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/make.py b/DesktopEditor/doctrenderer/docbuilder.java/make.py index 414f815073..3127dd7bc4 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/make.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/make.py @@ -1,10 +1,17 @@ import os import argparse +# NOTE: In JDK 8 and earlier, `javac` does not create the directories specified in the -d option if they do not already exist +# So we need to create them manually +def makedirs(dir): + if not os.path.exists(dir): + os.makedirs(dir) + return + if __name__ == "__main__": parser = argparse.ArgumentParser(description='Build Java wrapper for docbuilder library') parser.add_argument('-H', '--headers', action='store_true', help='Generate C++ JNI header files') - parser.add_argument('-jar', '--jar', action='store_true', help='Build into JAR archive') + parser.add_argument('-n', '--no-jar', dest='no_jar', action='store_true', help='Build only classes without JAR archive') args = parser.parse_args() file_dir = os.path.dirname(os.path.realpath(__file__)); @@ -20,12 +27,13 @@ if __name__ == "__main__": # BUILD classes_dir = file_dir + '/build/classes' + makedirs(classes_dir + '/docbuilder/utils') headers_dir = file_dir + '/src/jni' - # build all main Java classes + # build all Java classes os.system('javac -d ' + classes_dir + (' -h ' + headers_dir if args.headers else '') + java_files) # PACKING TO JAR - if args.jar: + if not args.no_jar: os.chdir(classes_dir) class_files = '' for file in os.listdir('docbuilder'): @@ -33,4 +41,5 @@ if __name__ == "__main__": class_files += ' docbuilder/' + file class_utils_file = ' docbuilder/utils/NativeLibraryLoader.class' class_files += class_utils_file + makedirs('../libs') os.system('jar -cvf ../libs/docbuilder.jar ' + class_files) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py index b779a1096d..16a10e8f02 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py @@ -1,6 +1,5 @@ import os import argparse -import platform if __name__ == "__main__": parser = argparse.ArgumentParser(description='Build and run the test example for docbuilder Java wrapper') @@ -14,9 +13,9 @@ if __name__ == "__main__": if args.builder_dir: builder_dir = args.builder_dir - os.system('java -cp ../build/classes' + os.pathsep + 'build/classes -Djava.library.path=\"' + builder_dir + '\" Program') + os.system('java -cp ../build/libs/docbuilder.jar' + os.pathsep + 'build/classes -Djava.library.path=\"' + builder_dir + '\" Program') else: - os.system('javac -d build/classes -cp ../build/classes ' + java_file) + os.system('javac -d build/classes -cp ../build/libs/docbuilder.jar ' + java_file) print('Program was built successfully') - print('Run it with: java -cp \"../build/classes' + os.pathsep + 'build/classes\" -D\"java.library.path\"=\"path_to_docbuilder\" Program') + print('Run it with: java -cp \"../build/libs/docbuilder.jar' + os.pathsep + 'build/classes\" -D\"java.library.path\"=\"path_to_docbuilder\" Program') print('Or just run: python make_test.py --run \"path_to_docbuilder\"') From 0fc5133d98f85494719e4dd146f8e03369038ff9 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 2 Aug 2024 16:05:08 +0400 Subject: [PATCH 23/26] Fix for building test example --- .../doctrenderer/docbuilder.java/test/make_test.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py index 16a10e8f02..36e38cffda 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py @@ -1,6 +1,13 @@ import os import argparse +# NOTE: In JDK 8 and earlier, `javac` does not create the directories specified in the -d option if they do not already exist +# So we need to create them manually +def makedirs(dir): + if not os.path.exists(dir): + os.makedirs(dir) + return + if __name__ == "__main__": parser = argparse.ArgumentParser(description='Build and run the test example for docbuilder Java wrapper') parser.add_argument('-r', '--run', dest='builder_dir', metavar='', help='Run the test example with specified docbuilder directory') @@ -15,6 +22,7 @@ if __name__ == "__main__": builder_dir = args.builder_dir os.system('java -cp ../build/libs/docbuilder.jar' + os.pathsep + 'build/classes -Djava.library.path=\"' + builder_dir + '\" Program') else: + makedirs('build/classes') os.system('javac -d build/classes -cp ../build/libs/docbuilder.jar ' + java_file) print('Program was built successfully') print('Run it with: java -cp \"../build/libs/docbuilder.jar' + os.pathsep + 'build/classes\" -D\"java.library.path\"=\"path_to_docbuilder\" Program') From 7171dcb9f0bb9db60d4d6f1dc4e9d513602f328c Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 2 Aug 2024 18:26:15 +0400 Subject: [PATCH 24/26] Set library path at runtime Now there is no need to pass `-D...` parameter to run java program --- .../doctrenderer/docbuilder.java/make.py | 25 +++--- .../docbuilder/utils/NativeLibraryLoader.java | 85 +++++++++++++++++-- 2 files changed, 88 insertions(+), 22 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/make.py b/DesktopEditor/doctrenderer/docbuilder.java/make.py index 3127dd7bc4..a98b2615b4 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/make.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/make.py @@ -8,6 +8,14 @@ def makedirs(dir): os.makedirs(dir) return +# return all files with extension `ext` in directory `dir` as string +def getFilesInDir(dir, ext): + files = ''; + for file in os.listdir(dir): + if file.endswith(ext): + files += ' ' + dir + '/' + file + return files + if __name__ == "__main__": parser = argparse.ArgumentParser(description='Build Java wrapper for docbuilder library') parser.add_argument('-H', '--headers', action='store_true', help='Generate C++ JNI header files') @@ -17,13 +25,8 @@ if __name__ == "__main__": file_dir = os.path.dirname(os.path.realpath(__file__)); os.chdir(file_dir + '/src/java') - java_files = '' - for file in os.listdir('docbuilder'): - if file.endswith('.java'): - java_files += ' docbuilder/' + file - - java_utils_file = ' docbuilder/utils/NativeLibraryLoader.java' - java_files += java_utils_file + java_files = getFilesInDir('docbuilder', '.java') + java_files += getFilesInDir('docbuilder/utils', '.java') # BUILD classes_dir = file_dir + '/build/classes' @@ -35,11 +38,7 @@ if __name__ == "__main__": # PACKING TO JAR if not args.no_jar: os.chdir(classes_dir) - class_files = '' - for file in os.listdir('docbuilder'): - if file.endswith('.class'): - class_files += ' docbuilder/' + file - class_utils_file = ' docbuilder/utils/NativeLibraryLoader.class' - class_files += class_utils_file + class_files = getFilesInDir('docbuilder', '.class') + class_files += getFilesInDir('docbuilder/utils', '.class') makedirs('../libs') os.system('jar -cvf ../libs/docbuilder.jar ' + class_files) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java index 6596cf3866..3ea326d46e 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/utils/NativeLibraryLoader.java @@ -1,16 +1,83 @@ package docbuilder.utils; +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; + public class NativeLibraryLoader { + // helper class for retrieving information about current OS + public static class OSChecker { + private static String osName = System.getProperty("os.name").toLowerCase(); + + public static boolean isWindows() { + return (osName.indexOf("win") >= 0); + } + + public static boolean isMac() { + return (osName.indexOf("mac") >= 0); + } + + public static boolean isLinux() { + return (osName.indexOf("nix") >= 0 || osName.indexOf("nux") >= 0 || osName.indexOf("aix") > 0); + } + } + static { - // TODO: name of icu libraries differ between systems. Handle that. - System.loadLibrary("icudt58"); - System.loadLibrary("icuuc58"); - System.loadLibrary("UnicodeConverter"); - System.loadLibrary("kernel"); - System.loadLibrary("kernel_network"); - System.loadLibrary("graphics"); - System.loadLibrary("doctrenderer"); - System.loadLibrary("docbuilder.jni"); + try { + Path libDirPath = getLibPath(); + // load icu libraries + if (OSChecker.isWindows()) { + System.load(libDirPath.resolve("icudt58.dll").toString()); + System.load(libDirPath.resolve("icuuc58.dll").toString()); + } else if (OSChecker.isMac()) { + System.load(libDirPath.resolve("libicudata.58.dylib").toString()); + System.load(libDirPath.resolve("libicuuc.58.dylib").toString()); + } else if (OSChecker.isLinux()) { + System.load(libDirPath.resolve("libicudata.so.58").toString()); + System.load(libDirPath.resolve("libicuuc.so.58").toString()); + } else { + throw new RuntimeException("Unsupported OS"); + } + + String[] libs = {"UnicodeConverter", "kernel", "kernel_network", "graphics", "doctrenderer", "docbuilder.jni"}; + + String prefix = ""; + if (OSChecker.isMac() || OSChecker.isLinux()) { + prefix = "lib"; + } + + String extension = ""; + if (OSChecker.isWindows()) { + extension = ".dll"; + } else if (OSChecker.isMac()) { + extension = ".dylib"; + } else { + extension = ".so"; + } + + for (String lib : libs) { + System.load(libDirPath.resolve(prefix + lib + extension).toString()); + } + } catch (UnsatisfiedLinkError e) { + throw new RuntimeException("Cannot load dynamic libraries. Check if JAR file is in the same directory as all docbuilder libraries."); + } + } + + // Returns path to the directory containing current JAR + public static Path getLibPath() + { + URL url = NativeLibraryLoader.class.getProtectionDomain().getCodeSource().getLocation(); + try { + File jarFile = new File(url.toURI()); + Path jarPath = jarFile.toPath(); + Path libDirPath = jarPath.getParent(); + + return libDirPath; + } catch (URISyntaxException exception) { + // Very unlikely to be happened + throw new RuntimeException("Cannot convert URI of the NativeLibraryLoader.class to URL"); + } } public static void loadLibraries() { From b707510c88dad10e64aa42f2645d735d595b4344 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 2 Aug 2024 18:38:40 +0400 Subject: [PATCH 25/26] Remove explicit `workDirectory` setting --- .../docbuilder.java/src/java/docbuilder/CDocBuilder.java | 4 ++++ .../doctrenderer/docbuilder.java/test/Program.java | 7 +++---- .../doctrenderer/docbuilder.java/test/make_test.py | 6 +++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java index 708c887837..1f252d4198 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilder.java @@ -1,5 +1,7 @@ package docbuilder; +import docbuilder.utils.NativeLibraryLoader; + public class CDocBuilder { public CDocBuilder() { c_internal = c_Create(); @@ -86,6 +88,8 @@ public class CDocBuilder { } public static void initialize(String directory) { + if (directory.isEmpty()) + directory = NativeLibraryLoader.getLibPath().toString(); c_InitializeWithDirectory(directory); } diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java index 09ca10747a..ce734e5f03 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/Program.java @@ -2,18 +2,17 @@ import docbuilder.*; public class Program { public static void main(String[] args) { - String workDirectory = "C:/Program Files/ONLYOFFICE/DocumentBuilder"; String resultPath = "result.docx"; - test(workDirectory, resultPath); + test(resultPath); // Need to explicitly call System.gc() because finalizers might not automatically get called // Note: Even System.gc() can not guarantee that finalizers will be actually called. Possible memory leaks! System.gc(); } - public static void test(String workDirectory, String resultPath) { - CDocBuilder.initialize(workDirectory); + public static void test(String resultPath) { + CDocBuilder.initialize(""); CDocBuilder builder = new CDocBuilder(); builder.createFile(FileTypes.Document.DOCX); diff --git a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py index 36e38cffda..9af45c86a1 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/test/make_test.py @@ -20,10 +20,10 @@ if __name__ == "__main__": if args.builder_dir: builder_dir = args.builder_dir - os.system('java -cp ../build/libs/docbuilder.jar' + os.pathsep + 'build/classes -Djava.library.path=\"' + builder_dir + '\" Program') + os.system('java -cp ' + builder_dir + '/docbuilder.jar' + os.pathsep + 'build/classes Program') else: makedirs('build/classes') os.system('javac -d build/classes -cp ../build/libs/docbuilder.jar ' + java_file) print('Program was built successfully') - print('Run it with: java -cp \"../build/libs/docbuilder.jar' + os.pathsep + 'build/classes\" -D\"java.library.path\"=\"path_to_docbuilder\" Program') - print('Or just run: python make_test.py --run \"path_to_docbuilder\"') + print('Run it with: java -cp \"/path/to/docbuilder/docbuilder.jar' + os.pathsep + 'build/classes\" Program') + print('Or just run: python make_test.py --run \"/path/to/docbuilder\"') From c6ca99994b3a2b14669d709d5d769de3ed3d3387 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 2 Aug 2024 19:35:13 +0400 Subject: [PATCH 26/26] Fix build into JAR on mac and linux --- DesktopEditor/doctrenderer/docbuilder.java/make.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/make.py b/DesktopEditor/doctrenderer/docbuilder.java/make.py index a98b2615b4..06f07170f1 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/make.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/make.py @@ -1,5 +1,7 @@ import os import argparse +import re +import platform # NOTE: In JDK 8 and earlier, `javac` does not create the directories specified in the -d option if they do not already exist # So we need to create them manually @@ -13,7 +15,11 @@ def getFilesInDir(dir, ext): files = ''; for file in os.listdir(dir): if file.endswith(ext): + # for non-windows systems '$'-symbol in file names should be escaped + if platform.system().lower() != 'windows': + file = re.sub(r'\$', r'\\$', file) files += ' ' + dir + '/' + file + return files if __name__ == "__main__":