Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильно написана процедура для Java native мет.? 
:(
    Опции темы
LexaL
Дата 4.5.2011, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 23.12.2010

Репутация: нет
Всего: нет



Вот код процедуры.
Код

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);


PM MAIL   Вверх
Akella
Дата 4.5.2011, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



и что?
PM MAIL   Вверх
LexaL
Дата 4.5.2011, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 23.12.2010

Репутация: нет
Всего: нет



Так правильно ли написана процедура или в ней есть ошибки?
PM MAIL   Вверх
LexaL
Дата 4.5.2011, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 23.12.2010

Репутация: нет
Всего: нет



Установлена последняя версия 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.
#


PM MAIL   Вверх
Akella
Дата 5.5.2011, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Ты же в разделе по Delphi
PM MAIL   Вверх
LexaL
Дата 5.5.2011, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 23.12.2010

Репутация: нет
Всего: нет



Я знаю, посмотрите на Delphi код правильный ли он?
PM MAIL   Вверх
LexaL
Дата 5.5.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 23.12.2010

Репутация: нет
Всего: нет



Возникает Access Violation в Delphi коде, в чем может быть причина?
PM MAIL   Вверх
Gwire
Дата 5.5.2011, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



Я чего-то не пойму. 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 могу отличатся по своей структуре. 
    Я утверждать не буду, что это именно так, но нужно учесть и такую вероятность, если незнаешь наверняка.


PM MAIL   Вверх
LexaL
Дата 5.5.2011, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 23.12.2010

Репутация: нет
Всего: нет



Использую Delphi, так как не знаю как в Java открыть и считать данные с многоканального изображения, а в Delphi знаю (код приведен выше).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1045 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.