2014-12-08 7 views
1

Мне интересно, почему jni programming guide сказалИспользование JNIEnv с парентазом или без него?

JNI обеспечивает несколько более понятный интерфейс для программистов C++. jni.h файл содержит набор инлайн C++ функций так, что родной метод программист может просто написать:

jclass cls = env->FindClass("java/lang/String"); 

вместо:

jclass cls = (*env)->FindClass(env, "java/lang/String"); 

дополнительный уровень косвенности на env и env аргумент до FindClass скрыты от программиста. Компилятор C++ просто расширяет функции функций членов C++ для своих C-аналогов; поэтому, полученный код точно такой же.

В чем разница между указателями c и C++?

+1

** Не используйте ** изображения для текста. – Deduplicator

+0

@ Дедупликатор и почему? Я просто хочу показать пример моего вопроса. – tonylin

+0

@tonylin, пожалуйста, найдите время, чтобы «ввести» строки. делает более удобочитаемым. –

ответ

1

Указатель C++ является указателем на класс object. Указатель C является указателем на function. Это две разные вещи.

Поскольку C++ object уже знает окружающую среду, вам не нужно передавать окружающую среду снова.

Указатель C Указатель - это указатель на структуру, и в этой структуре вы вызываете функцию. Функция не имеет состояния, поэтому вам нужно передать состояние (в данном случае такую ​​же структуру env, чтобы он мог найти переменные в этой структуре.).

В jni.h в JDK вы видите, что функция C++ является:

jclass FindClass(const char *name) { 
    return functions->FindClass(this, name); 
} 

И functions указатель внутри объекта, который указывает на env. Таким образом, версия C++ внутренне расширяется до версии C.

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