2016-10-03 3 views
1

Я пытался построить собственный метод и, хотя он, кажется, прекрасно работать, но я изо всех сил, чтобы понять поле [* значи] в функции -Разъяснение о GetFieldID

jfieldID GetFieldID(JNIEnv *env, jclass clazz, 
    const char *name, const char *sig); 

https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html

Например, у меня есть небольшой код Java, который использует переменную экземпляра, называемую «i», и все эти собственные методы (с именем test) умножают это на 2.

Теперь я имею в виду Java Complete Reference - здесь код идет как -

Мой вопрос: что такое «я» в этом - fid = (* env) -> GetFieldId (env, cls, "i", "I");

Когда я прочитал Oracle documenttion он говорит - https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html

доступа к полям объектов
GetFieldID

jfieldID GetFieldID(JNIEnv *env, jclass clazz,
const char *name, const char *sig); 

Возвращает поле идентификатора для экземпляра (нестатического) поле класс. Поле указано его именем и подписью. Семьи GetField и SetField для функций доступа используют идентификаторы полей для извлечения полей объектов.
GetFieldID() заставляет инициализировать неинициализированный класс.
GetFieldID() не может использоваться для получения поля длины массива. Используйте GetArrayLength() вместо этого.
ССЫЛКИ:
Индекс 94 в таблице функций интерфейса JNIEnv.
ПАРАМЕТРЫ:
env: указатель интерфейса JNI.
clazz: объект класса Java.
имя: имя поля в модифицированной строке UTF-8 с 0-символом.
sig: подпись поля в модифицированной строке UTF-8 с нулевым завершением.

Не могли бы вы объяснить, что это за поле «сиг»? Я не мог связать «я» ни с чем.

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

JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *env , jobject obj) 
{ 
    jclass cls; 
    jfieldID fid; 
    jint i; 

    printf("Starting the native method\n"); 

    cls = (*env)->GetObjectClass(env,obj); 
    fid = (*env)->GetFieldId(env,cls,"i", "I"); 
+0

Метод JNI или сигнатура поля такого типа - это то, что выводится командой 'javap -s' для этого метода или поля. Не беспокойтесь, пытаясь понять их сами, когда есть инструмент, который сделает это за вас. – EJP

ответ

1

см. Пример «сотрудник» ниже в Core Java, v. 2 ch. 12, Хорстманн и Корнелл по адресу http://www.horstmann.com/corejava.html «id» - это название поля, здесь частная двойная зарплата; внутри класса Employee; его подпись («sig») или тип, «D» (double) также должны быть указаны. в вашем коде «I» является целым числом. см. «Поля типа» в http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html после получения jFieldId, его можно использовать для изменения значения поля .

/** 
    @version 1.10 1999-11-13 
    @author Cay Horstmann 
*/ 

#include "Employee.h" 
#include <stdio.h> 

JNIEXPORT void JNICALL Java_Employee_raiseSalary(JNIEnv* env, jobject  this_obj, jdouble byPercent) 
{ 
    /* get the class */ 
    jclass class_Employee = (*env)->GetObjectClass(env, this_obj); 

    /* get the field ID */ 
    jfieldID id_salary = (*env)->GetFieldID(env, class_Employee, "salary", "D"); 

    /* get the field value */ 
    jdouble salary = (*env)->GetDoubleField(env, this_obj, id_salary); 

    salary *= 1 + byPercent/100; 

    /* set the field value */ 
    (*env)->SetDoubleField(env, this_obj, id_salary, salary); 
} 
+0

Спасибо. Это отвечает на мой вопрос. –

2

«I» здесь является сигнатурой примитивного целочисленного типа.Oracle предоставляет таблицу сигнатур типа: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp276

  • Z булева
  • Б байты
  • С символом
  • • короткое
  • Я Int
  • J длинный
  • F поплавок
  • D double

Для не примитивных типов, подпись формы

  • L полностью квалифицированный класс;

Для массивов [добавлен.

Для методов,() используются для выделения параметров из возвращаемого значения.

+0

Спасибо. Это отвечает на мой вопрос. –