Ještě jednou Delphi a Java, tentokrát v XE2 64bit

vložil Karel 30. července 2012 21:45

Před časem jsem psal o propojení projektů v Javě a Delphi prostřednictvím rozhraní JNI (unit JNI.pas). S přechodem na Windows 7 64bit a Java 1.7 64bit vyvstal jeden nepříjemný problém. Tím je generování výjimky Access violation v unitu JNI.pas v metodě TJNIEnv.ArgsToJValues, která má za úkol převést pole pascalských argumentů na pole argumentů pro Javu.

V originále zmíněná metoda vypadá takto:

    1function TJNIEnv.ArgsToJValues(const Args: array of const): PJValue;
    2var
    3  I: Integer;
    4begin
    5  if Length(Args) <> Length(FConvertedArgs) then
    6    SetLength(FConvertedArgs, Length(Args));
    7  for I := 0 to High(Args) do
    8    case Args[I].VType of
    9      vtInteger:
   10        FConvertedArgs[I].i := JInt(Args[I].VInteger);
   11      vtBoolean:
   12        FConvertedArgs[I].z := JBoolean(Args[I].VBoolean);
   13      vtWideChar:
   14        FConvertedArgs[I].c := JChar(Args[I].VWideChar);
   15      vtInt64:
   16        FConvertedArgs[I].j := JLong(Args[I].VInt64^);
   17      vtPointer, vtObject:
   18        FConvertedArgs[I].l := JObject(Args[I].VObject);
   19      vtAnsiString:
   20        FConvertedArgs[I].l := StringToJString(UTF8String(PAnsiString(Args[I].VAnsiString)^));
   21      vtWideString:
   22        FConvertedArgs[I].l := WideStringToJString(PWideString(Args[I].VWideString)^);
   23      {$IFDEF HAS_UNICODESTRING}
   24      vtUnicodeString:
   25        FConvertedArgs[I].l := WideStringToJString(PUnicodeString(Args[I].VUnicodeString)^);
   26      {$ENDIF}
   27      vtExtended:
   28        FConvertedArgs[I].d := Args[I].VExtended^; // Extended to Double (we lose Floats here)
   29    else
   30      raise EJNIError.Create('Unsupported variant argument');
   31    end;
   32  Result := PJValue(FConvertedArgs);
   33end;

Kompilátor si ovšem správně neporadí s použitými konstrukcemi pro převod řetězců na argumenty typu JValue, což má za následek nepříjemný pád, ke kterému dojde, když program zabrousí na některou z níže uvedených řádek kódu:

    1FConvertedArgs[I].l := StringToJString(UTF8String(PAnsiString(Args[I].VAnsiString)^));
    2FConvertedArgs[I].l := WideStringToJString(PWideString(Args[I].VWideString)^);
    3FConvertedArgs[I].l := WideStringToJString(PUnicodeString(Args[I].VUnicodeString)^);

Nepátral jsem sice po přesných příčinách těchto havárií, ale zdá se, že způsobené pády dostatečně řeší následující úprava kódu:

    1FConvertedArgs[I].l := StringToJString(UTF8String(PAnsiString(Args[I].VAnsiString)));
    2FConvertedArgs[I].l := WideStringToJString(PChar(PWideString(Args[I].VWideString)));
    3FConvertedArgs[I].l := WideStringToJString(PChar(PUnicodeString(Args[I].VUnicodeString)));


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy: , ,

Praxe

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS