90 likes | 307 Views
Bringing Ada to Eclipse Developers. Quentin Ochem Software Engineer. The initial situation. GNAT Development Environment. Eclipse environment. Formatting Quick Fixes Code assist Browsing …. Framework Resources Widgets Plugins …. Subprograms OOP Exceptions Callbacks. JNI.
E N D
Bringing Ada to Eclipse Developers Quentin Ochem Software Engineer
The initial situation GNAT Development Environment Eclipse environment Formatting Quick Fixes Code assist Browsing … Framework ResourcesWidgets Plugins … Subprograms OOP Exceptions Callbacks JNI Eclipse Plugin
Format command Calls the callback Example : formatting Ada Java JNI Computes format Updates the buffer
Ada Spec to JNI Compiler Overview of the Tool Wrappers to Ada to JNI Ada specs Javahigh level Interface (Wrappers JNI to Java)
Original Ada API package Test is function Addition (A, B : Integer) return Integer; end Test;
Generated code (1 / 3) pragma Warnings (Off); pragma Style_Checks ("NM32766"); with Interfaces.Java.JNI; with AJIS; with AJIS.Internal; with AJIS.Java; with AJIS.Internal.Java; with Ada.Characters.Conversions; with Ada.Finalization; with Test; use Test; package JNI_Binding.Test_JNI.Test_Package_JNI is pragma Elaborate_Body; function Id_JNI_5 (A : Standard.Integer; B : Standard.Integer) return Standard.Integer; function Addition_Id_JNI_4 (Id_JNI_1 : Interfaces.Java.JNI.JNI_Env_Access; Id_JNI_3 : Interfaces.Java.JNI.J_Class; A : Interfaces.Java.JNI.J_Int; B : Interfaces.Java.JNI.J_Int) return Interfaces.Java.JNI.J_Int; pragma Export (C, Addition_Id_JNI_4, "Java_com_adacore_test01_Test_Test_1Package_Addition_1Id_1JNI_14__II"); end JNI_Binding.Test_JNI.Test_Package_JNI;
Generated code (2 / 3) pragma Warnings (Off); pragma Style_Checks ("NM32766"); with Ada.Unchecked_Deallocation; with System.Address_To_Access_Conversions; with Ada.Unchecked_Conversion; with Ada.Tags; with Ada.Exceptions; with Interfaces.C; with Interfaces.C.Strings; with Test; use Test; packagebody JNI_Binding.Test_JNI.Test_Package_JNI is function Id_JNI_5 (A : Standard.Integer; B : Standard.Integer) return Standard.Integer is Id_JNI_7 : Standard.Integer renames Test.Addition (A, B); begin return Id_JNI_7; end Id_JNI_5; function Addition_Id_JNI_4 (Id_JNI_1 : Interfaces.Java.JNI.JNI_Env_Access; Id_JNI_3 : Interfaces.Java.JNI.J_Class; A : Interfaces.Java.JNI.J_Int; B : Interfaces.Java.JNI.J_Int) return Interfaces.Java.JNI.J_Int is begin declare Id_JNI_8 : Interfaces.Java.JNI.J_Int := Interfaces.Java.JNI.J_Int (Id_JNI_5 (Standard.Integer (A), Standard.Integer (B))); begin return Id_JNI_8; end; exception when J : AJIS.Java.Java_Exception => declare Result : Interfaces.Java.JNI.J_Int; begin Result := Interfaces.Java.JNI.Throw (Id_JNI_1, AJIS.Internal.Java.Throwable_Value (Ada.Exceptions.Exception_Message (J))); return 0; end; when E : others => declare Result : Interfaces.Java.JNI.J_Int; begin Result := Interfaces.Java.JNI.Throw_New (Id_JNI_1, Interfaces.Java.JNI.Find_Class (Id_JNI_1, String'("Lcom/adacore/ajis/NativeException;")), Interfaces.C.To_C (Ada.Exceptions.Exception_Information (E))); return 0; end; end Addition_Id_JNI_4; begin null; end JNI_Binding.Test_JNI.Test_Package_JNI;
Generated code (3 / 3) package com.adacore.test01.Test; import com.adacore.test01.Ada2Java.Library; @SuppressWarnings("unused") publicfinalclass Test_Package { staticpublicint Addition (int A, int B){ com.adacore.test01.Ada2Java.Library.lock.lock (); try { int Id_JNI_9 = Addition_Id_JNI_4 (A, B); return Id_JNI_9; } finally { com.adacore.test01.Ada2Java.Library.lock.unlock (); } } // Addition static { com.adacore.test01.Ada2Java.Library.load (); } nativestaticprivateint Addition_Id_JNI_4 (int A, int B); } // Test_Package package com.adacore.test01.Test; publicfinalclass Test_Package { staticpublicint Addition (int A, int B){ } // Addition } // Test_Package
Semantic match package Test; publicclass Rec { public Rec () { // Creates a Rec object on the // native heap. } publicint Func () { // Code … } } package Test is type Rec istaggedprivate; function Func (P : Rec) return Integer; private -- some code end Test;