Первый раз, когда я встретил этот тип блока, это было не для «java», а «C», поэтому я думаю, что это тот же интерес. Блок, определяемый:
extern "Java"
{
// some java definition
}
предназначен для указания GCC, что этот блок является интерфейсом java Это используется для описания того типа манипуляции, который используется для определения класса. Название mangling - это использование gcc для генерации имени функции по параметрам и т. Д. Подробнее ... http://www.agner.org/optimize/calling_conventions.pdf Итак, вы используете extern "Java"
, когда вы импортируете код Java с ним, вы можете называть его juste, как любая функция в C/C++ без спецификаций исковерканное имя. Мое единственное использование этого было для dll с некоторыми функциями C, определенными в, загруженными в код на C++, поэтому я использую extern «C» для указания GCC, что определение этой функции не использует управление именами. Ну, теперь как вызвать собственный метод в java, потому что все в java - это метод, все - объект, функции нет. Во-первых, вы должны описать свой класс в java, все ваши функции, которые вы хотите сделать в native langage, должны быть определены как native: private native void print();
. Во-вторых, обратно в свой родной заголовке кода, вы должны определить метод следующие номенклатуры:
extern "Java"
{
JNIEXPORT YourReturnType JNICALL Java_ClassName_MethodName (JNIEnv* env, jobject obj);
}
По крайней мере, все метод должен выглядеть так, вызвать JNI пошлет указатель JNIEnv и объект, который будет «это «в методе, если у вас есть другие аргументы, они должны быть предоставлены после двух основ. И, наконец, вы просто должны реализовать весь метод в родном файле кода, всегда после Нормативы, как:
JNIEXPORT void JNICALL Jave_Printer_print(JNIEnv* env, jobject obj)
{
printf("Hello world");
}
Теперь вы можете создать объект принтера в Java и вызвать метод печати определяется как родной. Надеюсь, я ответил на ваш вопрос.
Вы считали [googling 'gcj'] (https://www.google.com/search?clientrls=en&q=gcj&ie=UTF-8&oe=UTF-8)? – zneak
GCJ - компилятор GNU для Java. Таким образом, возможно, это справедливо для байт-кода, скомпилированного только GCJ. В любом случае, интересно, работает ли он без JNI. – Ihar
Он работает только с GCJ. В принципе никто не использует GCJ, так что это не имеет большого значения. – duskwuff