Как написать нативный код в ASM - PullRequest
0 голосов
/ 29 апреля 2018

Я заядлый писатель ASM. Я пытаюсь написать нативный код Java в asm. Проблема, с которой я сталкиваюсь, заключается в том, что параметры, передаваемые из Java, не воспринимаются ассемблерным кодом. Код C ++, по-видимому, получает параметры с использованием 64-битного соглашения о вызовах Windows, то есть rcx, rdx, r8, r9, stack, и первоначально я предполагал, что это будет то же самое для asm, но это не так. Я потратил довольно много времени на поиск возможных объяснений и примеров, но пока не нашел ни одного, поэтому я подумал, что спросить. Я очень ценю некоторую помощь в определении того, где я иду не так. Большое спасибо. Ниже приведены фрагменты кода, объясняющие, что я разработал до сих пор ...

В NativeInterface.java

public native static String test(int _number);

In Calling.java

String s=NativeInterface.test(123);

В NativeJava.asm

.data
dString     db  "This is my string",0
.code
java_test PROC _iNumber:QWORD
 invoke dialog_showMessageInteger,"ASM CODE","Number=",_iNumber
 mov rax,rv(java_createStringUTF8,JNIenv,ADDR dString)
 ret
java_test ENDP

Диалоговое окно, открытое в asm, показывает не «123», а «1918844240» Приведенный выше код успешно передает строку в Java.

Кажется, я могу успешно передать параметры в java из asm. На данный момент я не могу передать параметры в asm из Java.

Я надеялся, что будет использовано стандартное соглашение о вызовах в 64-битной среде Windows, но это не так. Я не могу найти документацию нигде. Может кто-нибудь, пожалуйста, объясните, что я должен ожидать в ASM. Большое, большое спасибо.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Для использования JNI:

  1. Напишите метод native в классе.
  2. Скомпилируйте класс.
  3. Используйте javah (или в Java 10, javac) для генерации заголовочного файла C / C ++.
  4. На выбранном вами языке реализуйте функции для сгенерированных подписей так же, как это делают C или C ++ с заголовками и библиотеками, предоставляемыми поставщиком Java. Обязательно экспортируйте имена функций дословно.

Когда вам нужно сделать вызов Java:

  1. Используйте javap -s, чтобы найти соответствующую подпись Java и описания типов.
  2. Выберите функцию вызова JNI, в зависимости от способа передачи параметров и типа метода, который вы вызываете.
0 голосов
/ 29 апреля 2018

Спасибо Питеру Кордесу, который предположил, что могут быть переданы некоторые скрытые параметры, и разобрал некоторый код C ++, чтобы узнать наверняка.

Мне не нужно было заходить так далеко. Я уже просматривал код C ++ и заметил, что все нативные подпрограммы имеют JNIenv и jclass в качестве первых двух параметров.

Я изменил свой код, чтобы прочитать ...

java_test PROC _JNIenv:QWORD,_jclass:QWORD,_iNumber:QWORD

и значение 123 действительно было дано успешно.

Предполагается, что первые два параметра - это JNIenv и вызывающий класс, но, учитывая то, как формируются функции C ++, я думаю, что это довольно хорошее предположение.

Спасибо за вашу помощь и поддержку. С уважением пенс Береги себя

...