Jni-сигнатури методів в java, intel® software


For example, the Java method:
long f (int n, String s, int [] arr);

has the following type signature:
(ILjava / lang / String; [I) J

Хм. не густо і не особливо зрозуміло. Спробую описати своїми словами.

JNI-сигнатура складається зі списку типів формальних параметрів і типу значення, що повертається. Формат запису схожий на Pascal-style визначення методів: спочатку параметри потім повертається значення (до слова, мало хто знає що багато концепції Java були скопійовані з мови і операційної системи Oberon є подальшим розвитком ідей Н.Вірта, творця Pascal). У JNI-сигнатури прогалини заборонені - кожен символ має значення і не може бути викинутий без втрати сенсу. Елементи списку параметрів не розділяються ніякими символами. Про позначенні типів формальних параметрів нижче. Умовно можна виділити 4 правила:

    1. Примітивні типи: кодуються відповідною буквою латинського алфавіту (табл вище):
    1. Масиви: для позначення того, чо буде передаватися не скалярний тип, а масив використовується символ "[". Що знаходиться правіше квадратної дужки позначення типу - тип елемента масиву. Розмір масиву не позначається.
    1. Довідкові типи (об'єкти): Позначення класу починається з великої латинської L після якої йде без пробілів повне ім'я класу, що складається з: пакета (вкладені пакети поділяються Слеш) і імені класу (також розділених слешем). Запис є регістру залежною. Після імені класу повинна обов'язково йти кома, що є закінченням визначення типу. Звертаю увагу, що опускати кому не можна (в тому числі і в описі типу значення, що повертається методу).
    1. Повертається тип void (тобто нічого) замінюються символом "V"

Тепер продемонструю це на практиці:

1. int MyMethod1 (float a, char b) -> (FC) I

2. int [] MyMethod2 (long [] a) -> ([J) [I

3. void MyMethod3 (package1.subpackage2.MyClass [] a, String b) -> (Lpackage1 / subpackage2 / MyClass; Ljava / lang / String;) V

4. package1.subpackage2.MyClass [] MyMethod4 (String a, Class [] b, float c) -> (Ljava / lang / String; [java / lang / Class; F) [Lpackage1 / subpackage2 / MyClass;


Так що магічні на перший погляд послідовності символів виявляються досить прості (з відміну від сигнатур в мові C).

P.S. Набирав цю замітку на планшеті в метро. Виявилося, планшети цілком придатні для створення контенту. Хоча над зручністю клавіатури андроїда ще можна попрацювати))

Для отримання докладної інформації про можливості оптимізації компілятора зверніться до нашого повідомленням про оптимізацію.