Вопрос:

Как получить доступ к методу Java в приложении C ++

java c++ c

23247 просмотра

7 ответа

1669 Репутация автора

Просто простой вопрос: возможно ли вызвать функцию Java из c / c ++?

Автор: Hemant Источник Размещён: 14.06.2009 01:27

Ответы (7)


9 плюса

558784 Репутация автора

Да, это так, но вы должны сделать это через JNI: http://java.sun.com/javase/6/docs/technotes/guides/jni/index.html

Автор: CB Bailey Размещён: 14.06.2009 01:31

3 плюса

75382 Репутация автора

Есть много способов. Вот несколько идей. Кроме того, коммерческие мосты Java-COM позволяют COM-коммуникацию от c ++ до java (если вы используете Windows). Вы также должны посмотреть на CNI .

Автор: Yishai Размещён: 14.06.2009 01:32

44 плюса

11991 Репутация автора

Решение

Да, вы можете, но это немного запутанно, и работает отражающим / не типичным безопасным способом (пример использует API C ++, который немного чище, чем версия C). В этом случае он создает экземпляр Java VM из кода C. Если ваш нативный вызываемый сначала вызывается из Java, тогда нет необходимости создавать экземпляр VM

#include<jni.h>
#include<stdio.h>

int main(int argc, char** argv) {

    JavaVM *vm;
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_2;
    vm_args.nOptions = 0;
    vm_args.ignoreUnrecognized = 1;

    // Construct a VM
    jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);

    // Construct a String
    jstring jstr = env->NewStringUTF("Hello World");

    // First get the class that contains the method you need to call
    jclass clazz = env->FindClass("java/lang/String");

    // Get the method that you want to call
    jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase",
                                      "()Ljava/lang/String;");
    // Call the method on the object
    jobject result = env->CallObjectMethod(jstr, to_lower);

    // Get a C-style string
    const char* str = env->GetStringUTFChars((jstring) result, NULL);

    printf("%s\n", str);

    // Clean up
    env->ReleaseStringUTFChars(jstr, str);

    // Shutdown the VM.
    vm->DestroyJavaVM();
}

Чтобы скомпилировать (в Ubuntu):

g++ -I/usr/lib/jvm/java-6-sun/include \ 
    -I/usr/lib/jvm/java-6-sun/include/linux \ 
    -L/usr/lib/jvm/java-6-sun/jre/lib/i386/server/ -ljvm jnitest.cc

Примечание: код возврата от каждого из этих методов должен быть проверен для реализации правильной обработки ошибок (я проигнорировал это для удобства). Например

str = env->GetStringUTFChars(jstr, NULL);
if (str == NULL) {
    return; /* out of memory */
}
Автор: Michael Barker Размещён: 14.06.2009 02:02

2 плюса

21636 Репутация автора

Да, вы можете вызывать функцию Java из C ++ или C, но если вы не используете что-то вроде COM или CORBA (или другого стороннего инструмента, о котором я, вероятно, не знаю), вам придется делать это в контексте JNI.

Вся процедура вызова метода Java из нативного кода описана в главе 4 в разделе 4.2 под названием «Вызов методов» в pdf-руководстве Sun по JNI, которое вы можете найти здесь .

Автор: Timo Geusch Размещён: 14.06.2009 02:05

2 плюса

237712 Репутация автора

Взгляните на API вызова . Это позволяет загрузить и запустить в JVM из внутри вашего собственного приложения, а затем вызывать методы на него из приложения.

Кратко (из связанного документа)

/* 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); 
Автор: Brian Agnew Размещён: 14.06.2009 02:40

1 плюс

6408 Репутация автора

Следующая функция позволяет вам создать виртуальную машину.

JNIEnv* create_vm(JavaVM ** jvm)
{
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options[2];

    options[0].optionString = "-Djava.class.path=.";
    options[1].optionString = "-DXcheck:jni:pedantic";  

    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 2;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = JNI_TRUE; // remove unrecognized options

    int ret = JNI_CreateJavaVM(jvm, (void**) &env, &vm_args);
    if (ret < 0) printf("\n<<<<< Unable to Launch JVM >>>>>\n");
    return env;
}

Скомпилируйте знаменитую программу Hello World . Следующая функция пытается вызвать основной метод программы HelloWorld.

int main(int argc, char* argv[])
{
    JNIEnv* env;
    JavaVM* jvm;

    env = create_vm(&jvm);

    if (env == NULL) return 1;

    jclass myClass = NULL;
    jmethodID main = NULL;


    myClass = env->FindClass("HelloWorld");


    if (myClass != NULL)
        main = env->GetStaticMethodID(myClass, "main", "([Ljava/lang/String;)V");
    else
        printf("Unable to find the requested class\n");


    if (main != NULL)
    {
       env->CallStaticVoidMethod( myClass, main, " ");

    }else printf("main method not found") ;


    jvm->DestroyJavaVM();
    return 0;
}

Теперь поместите функцию create_vm и функцию main в один файл cpp, включите jni.h и скомпилируйте его. Я использовал MinGW на Windows.

g++ -D_JNI_IMPLEMENTATION_ -I"C:\Program Files\Java\jdk1.6.0_32\include" -I"C:\Program Files\Java\jdk1.6.0_32\include\win32" hello.cpp -L"C:\Program Files\Java\jre6\bin\client" -ljvm -o hello.exe

Exection Теперь, если вы запустите созданный exe, вы получите ошибку. jvm.dll не найден . Вставьте C:\Program Files\Java\jre6\bin\clientпеременную среды PATH. Теперь вы можете запустить исполняемый файл.

Примечание. Не перемещайте файл jvm.dll.

Автор: Sorter Размещён: 21.11.2012 05:26

0 плюса

912 Репутация автора

После написания приведенных выше примеров вам необходимо выполнить некоторые настройки вашего проекта.

Шаги, чтобы связать jvm.lib с вашим проектом в Visual Studio:

  • Щелкните правой кнопкой мыши по проекту -> свойства.
  • В диалоговом окне «Свойства» добавьте jvm.lib под «Линкер» -> «Ввод» -> «Дополнительные зависимости».
  • Наконец, напишите путь jvm.lib (например, «C: \ Program Files \ Java \ jdk1.7.0_60 \ lib») в Linker-> General-> AdditionalLibraryDirectories

После этих шагов ваш проект может ссылаться на jvm и работать хорошо.

Автор: Mustafa Kemal Размещён: 05.09.2014 11:45
Вопросы из категории :
32x32