Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Правильно написана процедура для Java native мет.?


Автор: LexaL 4.5.2011, 15:51
Вот код процедуры.
Код

library LoadLanImpl;

uses
  Windows,SysUtils,Classes,JNI;

type
 LAN_Header=record
  HDWORD:array[0..5] of byte;
  IPACK:word;
  NBANDS:word;
  unused1:array[0..5] of byte;
  ICOLS:integer;
  IROWS:integer;
  XSTART,YSTART:integer;
  unused2:array[0..55] of byte;
  MAPTYP,NCLASS:word;
  unused3:array[0..13] of byte;
  IAUTYP:word;
  ACRE,XMAP,YMAP,XCELL,YCELL:single;
 end;
 type mas=array of array of array of JShort;
 procedure Java_createhypertables_LoadLAN_displayMass(PEnv: PJNIEnv; Obj: JObject;  value: JString; var data:mas); {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  var FData:file;
      Header:LAN_HEADER;
      buf:smallint;
      i,j,k:integer;
      nCols,nRows,nBands:integer;
      flLoadData:boolean;
      value1:WideString;
  begin
    value1:=JNI_JStringToWideString(PEnv, value);
    try
    AssignFile(FData,value1);
    Filemode:=fmOpenread;
    Reset(FData,1);
    BlockRead(FData,Header,sizeof(Header));
    Setlength(data,Header.IROWS,Header.ICOLS,Header.NBANDS);
    nRows:=Header.IROWS;
    nCols:=Header.ICOLS;
    nBands:=Header.NBANDS;
     for i:=0 to Header.IROWS-1 do
      for k:=0 to Header.NBANDS-1 do
       for j:=0 to Header.ICOLS-1 do
        begin
         BlockRead(FData,buf,2);
         data[i,j,k]:=buf;
         end;
       flLoadData:=true;
      finally
       CloseFile(FData);
  end;
end;

exports  Java_createhypertables_LoadLAN_displayMass;

end.


Сам native метод: 
Код

public native short[][][] displayMass(String value);
      static
      {
        System.loadLibrary("LoadLanImpl");
      }


И его вызов:

Код

String value = "F:/ImageTest.lan";
                short[][][] sh = new short[172][111][242]; 
                sh = ll.displayMass(value);


Автор: Akella 4.5.2011, 20:55
и что?

Автор: LexaL 4.5.2011, 21:51
Так правильно ли написана процедура или в ней есть ошибки?

Автор: LexaL 4.5.2011, 22:21
Установлена последняя версия JRE, при попытке получить значения из массива выдает ошибку :

#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x047d55ac, pid=3960, tid=2520
#
# JRE version: 6.0_24-b07
# Java VM: Java HotSpot™ Client VM (19.1-b02 mixed mode, sharing windows-x86 )
# Problematic frame:
# C [LoadLanImpl.dll+0x55ac]
#
# An error report file with more information is saved as:
# F:\workspace\CreateHyper\hs_err_pid3960.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#


Автор: Akella 5.5.2011, 08:41
Ты же в разделе по Delphi

Автор: LexaL 5.5.2011, 09:04
Я знаю, посмотрите на Delphi код правильный ли он?

Автор: LexaL 5.5.2011, 11:08
Возникает Access Violation в Delphi коде, в чем может быть причина?

Автор: Gwire 5.5.2011, 11:23
Я чего-то не пойму. LexaL, если ты знаешь Java зачем ты используешь неизвесный тебе Delphi.
А по поводу правильный/неправильный:
- я вижу "stdcall" в коде Delphi, но я понятия не имею как делается стандартный вызов из Java
- насколько я могу судить ты нигде не получил указатель на ф-цию "Java_createhypertables_LoadLAN_displayMass".
- строка "type mas=array of array of array of JShort;" 
    нерекомендуется в библиотеках выделять память для динамических массивов, которые используются в качестве параметров функций. ("; var data:mas)")
    Делаешь ф-цию возвращающюю необходимое количество памяти (длины массивов). В главной программе выделяешь (в ней же потом освобождаешь) память
    (или как в твоем случае устанавливаешь длины массивов). 
    Передаешь в ф-цию "Java_createhypertables_LoadLAN_displayMass" указалель на массив, и она его просто дожна заполнить, без всяких "Setlength".
- да и динамические массивы Delphi и Java могу отличатся по своей структуре. 
    Я утверждать не буду, что это именно так, но нужно учесть и такую вероятность, если незнаешь наверняка.


Автор: LexaL 5.5.2011, 11:59
Использую Delphi, так как не знаю как в Java открыть и считать данные с многоканального изображения, а в Delphi знаю (код приведен выше).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)