2009-05-04 3 views

ответ

20

В качестве примера, проверьте Creating a JVM from C. Он показывает пример процедуры для создания JVM и вызова метода. Если JVM уже существует; например ваша программа C вызывается программой Java (ситуация обратного вызова), вы можете кэшировать указатель JNIEnv *.

Как совет, будьте осторожны с указателями кэширования в JVM из C/C++, есть некоторые семантики, связанные с тем, что вы можете кэшировать, и это может быть вызвано позже. Для этого, как указал Брайан Агне, проверьте ссылку JNI.

+0

Этот тип вызова - то, что им нужно. вопрос в том, что такое con's этого метода. – user63898

+0

сложность. но я считаю, что без сторонних инструментов единственный метод из того, что я прочитал. – bbqchickenrobot

2

Читайте также: JNI.

+3

Я знаю, что с помощью JNI можно вызывать функции C++ из Java, но как вы можете использовать его для вызова функций Java из C++? –

+0

@AndersonGreen Да, можно вызвать Java-методы из C++. К сожалению, есть гораздо больше информации о вызове C++ из Java, но я нашел пару учебников, http://www.ibm.com/developerworks/java/tutorials/j-jni/section3.html и http: //www.codeproject.com/Articles/22881/How-to-Call-Java-Functions-from-C-Using-JNI. У меня были некоторые проблемы с каждым учебным пособием, и в учебнике IBM есть некоторые тревожные несоответствия, но это лучшее, что я могу найти в это время. – StockB

15

Проверьте JNI Invocation interface. Это позволит вам встроить JVM в приложение C (или C++).

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

+1

Это не ваша ошибка, но ссылка интерфейса интерфейса JNI нарушена.Кажется, Oracle переместил каждый ресурс JNI, который у них был, поскольку неработающие ссылки повсюду ищут информацию JNI. – StockB

+0

Похоже, что эта ссылка была исправлена ​​сейчас –

1

Солнце имеет very good and basic example of JNI.

+12

Deadlink. Обновите – learnvst

+0

Это единственная рабочая копия статьи, которую я могу найти в Google: http://enos.itcollege.ee/~jpoial/oop/lugemist/JDCBook/JDCBook/jniexamp.html – mrt

3

Эта страница полезна: http://hildstrom.com/projects/jni/index.html

Предположим, у вас есть класс Java:

package foo; 
public class bar { 
    public static int timesTen(int input){ 
     return input * 10; 
    } 
} 

После того, как у вас есть JVM и JNIEnv * (подробности опущены ...), вы можете вызвать метод Java от C++ следующим образом:

jclass myClass = env->FindClass("foo.bar"); 
jmethodID mid = env->GetStaticMethodID(myClass, "timesTen", "(I)I"); 
jint hundred = env->CallStaticIntMethod(myClass, mid, (jint)10); 

Это замалчивает много деталей, в том числе обработка исключений, которая, если опущена, приведет к сбою вашей JVM. Для всех поисковых запросов gory на «Java Native Interface» и следуйте ссылкам Oracle.

+4

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Perception

-2

Еще один простой способ вызова java-методов из CPP - пакетный файл.

system() 

Это метод вызова exe или bat-файлов с CPP. Поместите свой класс с помощью пути Java и пути к классам в пакетном файле и вызовите этот пакетный файл из CPP, используя system("batch-file-name.bat").

Легко и прямо.

Смежные вопросы