Add docbuilder.utils.Utils class to edit PATH on Windows

This commit is contained in:
Mikhail Lobotskiy
2024-07-25 20:06:11 +04:00
parent abaaa54bc2
commit f2acef6bb2
7 changed files with 83 additions and 8 deletions

View File

@ -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)

View File

@ -0,0 +1,9 @@
package docbuilder.utils;
public class Utils {
static {
System.loadLibrary("docbuilder.jni_utils");
}
public static native void addToPath(String directory);
}

View File

@ -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

View File

@ -0,0 +1,16 @@
#include "docbuilder_utils_Utils.h"
#include <stdlib.h>
#include <string>
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
}

View File

@ -0,0 +1,21 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* 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

View File

@ -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);

View File

@ -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\"')