Взаимодействие между native код, Java и .Net

Тази тема все още се пише...

I. Извикване на native код от Java
II. Извикване на Java код от native
III. Извикване на native код от .Net
IV. Извикване на .Net код от native
V. Маршалинг

Ще бъде разгледани:
  • native код писан на C/C++
  • Java VM байт код писан на Java
  • .Net CLR код писан на C#
       Взаимодействието между Java и native код е изчистено и се представя чрез строго дефиниран интерфейс - т.нар. JNI (Java Native Interface). За .Net нещата са доста по-размити. От една страна има технологията IJW (It Just Works), която позволява да се компилират C/C++ проекти за .Net с опция на компилатора. С помощта на IJW може да се пишат смесени асемблита (mix-mode, managed/unmanaged). Просто прекомпилирвате досегашния си native проект до mix-mode асемблита. От друга страна от чисто managed код може да се извикват C-style експортирани функции с P/Invoke или COM интерфейси с асемблита-обвивки.

       Но нека караме по ред наномерата.

I. Извикване на native код от Java

      

II. Извикване на Java код от native

      

III. Извикване на native код от .Net

       За да се вика COM dll от .Net трябва да се създаде "обвивка" - асембли, което ще извиква методите на COM-а. Програмата TlbImp.exe помага много, но в някои случаи (например с масиви) не се справя добре. В случай на проблем - с малко ръчна доработка нещата стават (не гледайте че статията е за стара версия на .Net - работи и за версия 3.5).

IV. Извикване на .Net код от native

      

V. Маршалинг

       Конвертирането на типовете на данните между native и managed кода се нарича маршалинг (Marshaling).
Размери на основните типове в managed езиците (Java и C#):
Тип Битове в Java Битове в C# Стойности Ст-т по подразбиране
bool 1 бит от 32-битов integer;
32 booleans - 32 бита от 32-битов integer
8 true, false false
byte 8 8 -128 до 127 0
short 16 16 -32768 до 32767 0
int 32 32 -2147483648 до 2147483647 0
long 64 64 -9223372036854775808 до 9223372036854775807 0
float 32 32 IEEE 754 floating point 0.0
double 64 64 IEEE 754 floating point 0.0
decimal - 128 ? 0.0
char 16 16 Unicode символ \u0000