Java JNI. Возврат значений из функций

Ответить
Realist
Сообщения: 134
Зарегистрирован: 08 фев 2014, 18:15

Java JNI. Возврат значений из функций

Сообщение Realist » 03 ноя 2014, 11:22

Пишу dll на ассемблере для подключения к Java через JNI. Не могу разобраться с принципом возврата результатов из нативных функций. Если функция возвращает int или byte, то для этого нужно в регистр EAX положить значение этого int или byte. Например, если в регистр положить 00000001, то функция вернет единицу. А что нужно сделать, чтобы функция возвращала float или String ? Если, в случае с float в регистр класть 4-х байтовое значение float, то результат возвращается как NAN. В случае со строками я кладу в регистр адрес начала строки (offset myString), но ява при этом выдает fatal error..

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Java JNI. Возврат значений из функций

Сообщение altwin » 04 ноя 2014, 08:09

Нужно передавать префикс:
C = char
D = double
F = float
I = int
J = long
S = short
Z = boolean
в jvm был api, а че там с dalvik я понятия не имею, нужно спеку читать, а на стороне java иметь wrapper(например http://asm.ow2.org/asm33/javadoc/user/o ... g.Class%29). String - это не примитив и передавать его нужно по чарам.

P.S. вообще это надо спрашивать у тех, кто с NDK чаще работает и что то нативное передает в java, я этой фигней не заморачиваюсь и вполне может быть что есть какой -то стандартный способ.
Изображение

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Java JNI. Возврат значений из функций

Сообщение klblk » 05 ноя 2014, 06:59

Как я понял к NDK это особого отношения не имеет. Я не уверен что dll и Android сочетаются.

По топику: не понимаю что мешает возвращать jint, jfloat, jstring и т.д? http://docs.oracle.com/javase/1.5.0/doc ... types.html

Realist
Сообщения: 134
Зарегистрирован: 08 фев 2014, 18:15

Re: Java JNI. Возврат значений из функций

Сообщение Realist » 05 ноя 2014, 08:17

altwink, klblk, так мне и нужна jvm. Прога под винду, а не под андроид.
klblk писал(а): По топику: не понимаю что мешает возвращать jint, jfloat, jstring и т.д?
Мешает то, что непонятно что и куда возвращать. Значение или адрес? В регистр или в стек?
C float вроде разобрался - значение (не адрес!) кладется в стек сопроцессора и оттуда уже извлекается JVM. Со строками пока все в тумане. Сегодня попробую переделать JAR файл в EXE и запихнуть его в дизассемблер, может там что увижу..

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Java JNI. Возврат значений из функций

Сообщение klblk » 05 ноя 2014, 08:29

Сорри не заметил строчку:
Realist писал(а):Пишу dll на ассемблере...
Тогда я пас. Хотя не совсем понимаю почему именно на ассемблере.

Realist
Сообщения: 134
Зарегистрирован: 08 фев 2014, 18:15

Re: Java JNI. Возврат значений из функций

Сообщение Realist » 05 ноя 2014, 10:46

klblk писал(а):
Хотя не совсем понимаю почему именно на ассемблере.
Потому что С++ я знаю откровенно плохо и задуманное (win32-отладчик) оказалось гораздо легче реализовать на асме, тем более что в интернете нашел похожий пример. А теперь появилась необходимость запустить эту программку из под JVM, чтобы обрабатывать данные и красиво выводить на экран. Так что я разбил прогу на несколько функций и оформил в виде dll.

Ответить