Встраивать Java в приложение на C ++?

Я получил приложение, написанное на C ++, и я могу расширить возможности приложений, написав для него плагины на C ++.

В основном я хочу включить Java в это приложение. Это уже сделано с Python (не сделанным мной).

Я читал кое-что о JNI, но всегда есть речь из полной программы, которая использует classы Java.

Я хотел бы использовать classы из C ++ в Java для взаимодействия с приложением.
В этом случае это 3D-приложение под названием Cinema 4D.

Есть ли способ скомпилировать и оценить Java-код во время работы приложения (на каком-то языке сценариев) с использованием JNI или что-то в этом роде?

Пример мнимого кода после вложения:

import c4d.documents.*; class Main { public static void main() { BaseDocument doc = GetActiveDocument(); BaseObject op = doc.GetActiveObject(); if (op != null) { op.Remove(); } } } 

Этот код должен взаимодействовать с Cinema 4D для удаления выбранного объекта.

Вы можете встраивать JVM в ваше приложение. В официальном справочнике Oracle есть несколько деталей. Краткое изложение этого:

 #include  /* where everything is defined */ int main() { JavaVM *jvm; /* denotes a Java VM */ JNIEnv *env; /* pointer to native method interface */ JDK1_1InitArgs vm_args; /* JDK 1.1 VM initialization arguments */ vm_args.version = 0x00010001; /* New in 1.1.2: VM version */ /* Get the default initialization arguments and set the class * path */ JNI_GetDefaultJavaVMInitArgs(&vm_args); vm_args.classpath = ...; /* load and initialize a Java VM, return a JNI interface * pointer in env */ JNI_CreateJavaVM(&jvm, &env, &vm_args); /* invoke the Main.test method using the JNI */ jclass cls = env->FindClass("Main"); jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V"); env->CallStaticVoidMethod(cls, mid, 100); /* We could have created an Object and called methods on it instead */ /* We are done. */ jvm->DestroyJavaVM(); } 

Вы можете делать гораздо более сложные вещи, если хотите (например, пользовательские загрузчики classов), но это связано с минимальным минимумом, необходимым для работы JVM в вашем приложении.

Кажется, есть некоторая путаница в том, хотите ли вы встроить Java в приложение C ++ или наоборот. Я возьму каждое дело.

  1. Для встраивания java в приложение c ++ вы можете сделать вызов сокета в java-программу. В конце java вы используете SocketServer и на конце C ++ используется библиотека General Socket Layer. Это, безусловно, самый простой и масштабируемый подход. Поскольку ваша рабочая нагрузка java продолжает расти, вы продолжаете добавлять дополнительные jvm. Немного сложный для развертывания, но он работает очень хорошо.

  2. Для встраивания приложения C ++ в java. Это просто. Вы компилируете приложение C ++ в общую библиотеку и используете JNI для его вызова.

В основном я хочу включить Java в это приложение. Это уже сделано с Python (не сделанным мной).

API-интерфейс JNI Invocation поддерживает это, как описано в @awoodland. Вот текущая ссылка для Java 6/7 .

Я хотел бы использовать classы из C ++ в Java для взаимодействия с приложением. В этом случае это 3D-приложение под названием Cinema 4D.

Для этого вы можете использовать одно из следующих:

  • Собственные методы Java, реализованные в C
  • ЮНА
  • SWIG

Есть ли способ скомпилировать и оценить Java-код во время работы приложения (на каком-то языке сценариев) с использованием JNI или что-то в этом роде?

BeanShell или Groovy , среди прочих, могут вас заинтересовать. Оба поддерживают динамически интерпретируемый код, который работает на JVM.

В последнее время я работаю над чем-то подобным. Для меня работала библиотека jni.h, которая появляется, когда вы устанавливаете java (Java \ jdk [version] \ include) и создаете dll с кодом c / c ++ в visual studio. Например:

test.h

 //declare the method you want to implement in c/c++ in the header //include the jni header #include  JNIEXPORT void JNICALL Java_Test_print(JNIEnv *, jobject); //Java_[Class Name]_[Method Name](pointer to JVM, java object); 

test.cpp

 extern "C" JNIEXPORT void JNICALL Java_WinampController_printTrackInfo (JNIEnv *env, jobject obj){ printf("Hey, I'm a java method in c (or not?)\n"); } 

Затем создайте dll с Visual Studio и загрузите dll в статический блок. Я не пробовал это, не компилируя код c / c ++ в dll, возможно, есть еще один способ вызвать код c / c ++. Но так вы его реализуете.

Test.java

 //declare the same method native inside a class in java public class Test{ static { System.loadLibrary("Test"); //load the dll } public native void print(); } //after that you just call test.print() normally 

Итак, вы просто делаете это и реализуете java-методы со всеми c / c ++, которые вы хотите.

Если вы все еще не знаете, как это сделать, просветите себя здесь:

Спецификация интерфейса Java Java – Oracle

Интерфейс Java Native – Википедия

Для сценария, который вы описываете JNI, вероятно, лучший способ. Вы бы разоблачили функциональность своего приложения на C ++ как DLL, которая может быть включена в приложение Java и использоваться.

Вам, вероятно, нужно переосмыслить свой дизайн. Java не является хорошим выбором для таких задач. В стандартной библиотеке java нет функции eval() аналогичной eval() из python или оболочки.

Вы можете создать Java-Java в C ++-коде, используя JNI, но это тяжело. По-прежнему существует проблема с созданием байт-кода из источника java. Вам нужно будет встроить много кода для компиляции и запуска Java-кода в C ++. Не делай этого. Должно быть лучшее решение.

Например, вы можете использовать RPC (SOAP, XML-RPC, Corba) между кодом C ++ и отдельным кодом Java. Если вам нужно выполнить некоторый вызов eval() подобный java, вы можете использовать Groovy или Jython (оба имеют eval() , доступ ко всей стандартной java-библиотеке и могут запускать обычные classы Java).

  • Файловые операции в Android NDK
  • Как найти утечки памяти из собственного кода в android
  • SQLite с Android NDK
  • Java Native Access не делает C ++, не так ли?
  • Ошибка JNI Hello World Неудовлетворительная ссылка
  • Как вернуть массив из JNI в Java?
  • Связь между Java и Haskell
  • Рег. Добавление OpenCV в собственный C-код через CMake на Android Studio
  • Как я могу поймать SIGSEGV (segmentation fault) и получить трассировку стека под JNI на Android?
  • Управление зависимостями DLL с Maven
  • Как импортировать class из пакета по умолчанию
  • Давайте будем гением компьютера.