, и я хочу, чтобы основная активность была на java не на kotlin
blockquote>Вы всегда можете иметь свой
MainActivity
в java, а не в Kotlin.
Один из подходов, который вы можете использовать, - это использовать ассемблер во время сборки для генерации констант во время компиляции.
Первый шаг - создать файл, содержащий все инструкции по сборке, которые вы будете использовать, по одной на строку.
Например:
cmpwi 3,0x20
addi 3,3,0
blr
Назовите этот файл input.def. Затем используйте этот скрипт:
#!/usr/bin/env bash
(cat << HEADER
.global main
.text
main:
HEADER
cat input.def) > asm.s
powerpc-linux-gnu-as asm.s -o asm.o
powerpc-linux-gnu-objdump -d asm.o | \
sed '1,/<main>/ d' | \
paste -d'\t' - input.def | \
awk -F'\t' '{
bytes=$2
asm=$4
disasm=$3
gsub(/ /, "", bytes);
gsub(/[, ]+/, "_", asm);
printf("#define ASM_%-20s 0x%s // disassembly: %s\n", asm, bytes, disasm)
}'
# Clean temporaries
rm asm.s asm.o
(здесь я использую GNU-ассемблер и objdump. Возможно, вам придется изменить эту часть, если вы не используете эти инструменты. Objdump используется в качестве прославленного hexdump утилита здесь.)
Этот скрипт оболочки:
Это большая работа, но вы можете сделать все это во время компиляции.
Это создает заголовочный файл с именем asm.h:
#define ASM_cmpwi_3_0x20 0x2c030020 // disassembly: cmpwi r3,32
#define ASM_addi_3_3_0 0x38630000 // disassembly: addi r3,r3,0
#define ASM_blr 0x4e800020 // disassembly: blr
Вы используете файл asm.h так:
#include "asm.h"
*((volatile int *)(0x80001234)) = ASM_cmpwi_3_0x20;
Если вам нужна новая константа asm, отредактируйте input.def и перезапустите сценарий оболочки.