
Pendahuluan
Semuanya dimulai dengan fakta bahwa saya tidak sengaja menemukan daftar program homebrew (program yang dikembangkan oleh upaya pengguna untuk perangkat yang tidak dimaksudkan untuk menjalankan perangkat lunak pengguna) untuk Nintendo DS dan saya melihat satu baris yang sangat menarik di dalamnya, yaitu: βPstros NDS - menjalankan implementasi MIDP pada mesin java CLDC dikompilasi untuk NDS. "
Menjadi penggemar berat Java dan Nintendo DS, saya memutuskan untuk mencari tahu apa jenis binatang buas ini dan, jika mungkin, cobalah untuk menulis aplikasi saya untuk JVM ini. Mereka yang tertarik meminta kucing.
Pstros nds
Setelah mengunduh arsip berharga dari situs tersebut, saya mulai merisetnya. Setelah membaca readme, ternyata Pstros NDS adalah port KVM (mesin virtual Java yang dikembangkan oleh Sun Microsystems) untuk Nintendo DS. Sebagai berikut dari artikel di Internet (
artikel 1 ,
artikel 2 ), mesin Java ini dirancang untuk perangkat kecil dengan jumlah RAM terbatas, dan milik subset platform Java - J2ME.
Arsitektur J2ME
J2ME memiliki arsitektur modular di mana konfigurasi dan profil adalah elemen inti.
Konfigurasi adalah spesifikasi yang menjelaskan alat yang tersedia untuk pengembangan untuk kelompok perangkat seluler tertentu (seperangkat fitur bahasa Jawa, fitur dan kemampuan mesin virtual, perpustakaan yang didukung minimum).
Profil ini memperluas dan melengkapi fungsi konfigurasi untuk perangkat seluler tertentu. Ini memungkinkan untuk bekerja dengan tampilan grafik, fungsi komunikasi, periferal tertentu (dalam kasus kami, ini adalah layar sentuh).
Diagram arsitektur J2ME disajikan di bawah ini:

Luncurkan homebrew
Anda tidak bisa menjalankan perangkat lunak Nintendo yang tidak bersertifikat di konsol. Untuk mengatasi masalah ini, kartrid flash khusus telah dibuat (pada kenyataannya, kemungkinan besar mereka diciptakan untuk meluncurkan salinan game bajakan, dan homebrew adalah produk sampingan, tetapi ceritanya bukan tentang itu).
Ada banyak opsi kartrid flash dengan harga terjangkau di AliExpress. Untuk saya sendiri, saya memesan R4i Dual Core. Menggunakannya sangat sederhana: cukup buka ritsleting arsip khusus ke dalam root microSD, unggah file di sana dengan mesin Java dalam format jvm, masukkan kartrid flash ke konsol dan Anda dapat menggunakannya.

Peluncuran pertama KVM
Ada beberapa contoh program java di arsip Pstros NDS. Untuk menjalankan program ini, Anda harus meletakkannya di mana saja pada kartrid flash microSD. Setelah memulai kvm.nds, Anda akan dapat memilih file di sistem file:

Setelah memilih file Hello.class kita akan melihat yang berikut:

Beberapa contoh aplikasi lagi:


Emulator
Menghubungkan Nintendo DS langsung ke komputer, sejauh yang saya tahu, tidak mungkin. Terus menempelkan microSD dari komputer ke perangkat dan kembali untuk melihat hasilnya, terlalu lama. Karena itu, untuk uji peluncuran aplikasi, kami akan menggunakan emulator
DeSmuME yang populer.
Ada beberapa fitur dalam meluncurkan aplikasi homebrew untuk DeSmuME. Sejauh yang saya mengerti pertanyaannya, ini berasal dari masalah bekerja dengan sistem file pada kartrid flash.
Untuk interaksi aplikasi homebrew dengan sistem file, pustaka libfat ditulis. Namun, ada sejumlah besar kartrid flash untuk Nintendo DS, dan mereka semua menggunakan perintah baca / tulis file tertentu. Perpustakaan libfat tidak dapat mengenali perintah-perintah ini dan mengirim pesan kesalahan ke aplikasi homebrew. Untuk menghindari hal ini, sebuah teknologi diciptakan yang disebut DLDI (Dynamically-Linked Device Interface). Ini bertindak sebagai lapisan antara aplikasi homebrew dan kartrid flash, mengubah perintah baca / tulis spesifik menjadi perintah yang dapat dimengerti oleh libfat libraries.
Saat mencoba memulai DeSmuME kvm.nds, kami mendapatkan kesalahan berikut:

FAQ untuk emulator menunjukkan bahwa patch DLDI akan diterapkan secara otomatis, tetapi untuk akses yang benar ke file, Anda harus menentukan Perangkat Kartu Flash MPCF dalam slot GBA, seperti yang ditunjukkan pada gambar di bawah ini:

Setelah itu, JVM dimulai secara normal.
Menyiapkan lingkungan pengembangan
Mempelajari arsip dengan jvm, saya perhatikan file _rebuild.bat. Isinya disajikan di bawah ini:
Konten _rebuild.batSET WTKDIR=c:/wtk22 SET CP=%WTKDIR%/lib/cldcapi10.jar;%WTKDIR%/lib/midpapi20.jar;./classes.zip del .\output\*.* /Q "c:/program files/java/jdk1.5.0_06/bin/javac.exe" -source 1.3 -target 1.1 -bootclasspath %CP% ./src/*.java %WTKDIR%/bin/preverify -classpath %CP% ./src del .\src\*.class /Q copy output\*.* .\
Dari sini menjadi jelas bagaimana membangun aplikasi untuk jvm dan lingkungan seperti apa yang kita butuhkan. Di situs web oracle, arsip berisi versi wtk dan jdk yang kita butuhkan. Instal sesuai jalur yang ditentukan dalam file bat (atau edit path dalam file bat) dan Anda dapat memulai pengembangan.
Pengembangan aplikasi
Berdasarkan sifat pekerjaan saya, saya banyak bekerja dengan perpustakaan untuk membuat GUI Swing. Saya suka perpustakaan ini, jadi sebagai contoh, saya memutuskan untuk menulis implementasinya sendiri. Saya memutuskan untuk mengembangkan berdasarkan "kotak hitam", yaitu Mengetahui bagaimana seharusnya terlihat di luar, jangan melihat bagaimana itu diatur di dalam. Pertama, karena perpustakaan yang saya rencanakan akan memiliki fungsionalitas yang jauh lebih sedikit (karena saya mengembangkannya untuk tujuan hiburan) dan, mungkin, banyak solusi yang digunakan dalam Swing tidak akan diperlukan untuk saya. Kedua, membuat implementasi Anda sendiri jauh lebih menarik.
Seperti yang Anda lihat dari skrip build, Anda harus mengembangkannya di bawah java 1.1.
Adapun persyaratan, pertama-tama, saya ingin agar pengguna perpustakaan untuk mendukung kode Swing khas untuk memohon bentuk dialog:
MyDialogForm myDialogForm = new MyDialogForm(this, true); myDialogForm.setVisible(true); if (myDialogForm.getAnsewer()) {
Yaitu dalam hal ini, bentuk dialog ditampilkan dan sampai ditutup, eksekusi tidak akan melampaui setVisible (true). Pada saat yang sama, untuk komponen lain yang ada di formulir yang dipanggil, pemrosesan tindakan penggunanya harus dilanjutkan.
Versi pertama dari skema operasi perpustakaan disajikan pada gambar di bawah ini:

Seperti yang Anda lihat dari diagram, setiap aksi pengguna dilakukan dalam utas terpisah. Dengan implementasi ini, persyaratan untuk bekerja dengan formulir dialog terpenuhi, namun, ada masalah dengan fakta bahwa pengguna di handler-nya dapat secara bersamaan bekerja dengan data yang sama dari dua utas (misalnya, dengan mengklik cepat pada dua tombol). Ini menciptakan ketidaknyamanan tambahan yang terkait dengan kebutuhan untuk melindungi akses ke data tersebut bagi pengguna.
Kami membuat asumsi bahwa semua bentuk bersifat interaktif, mis. ketika menampilkan satu formulir tidak mungkin untuk bekerja dengan formulir lain. Dalam hal ini, ini adalah asumsi yang memadai, karena layar Nintendo DS tidak besar, dan menampilkan beberapa bentuk sekaligus hanya merepotkan.
Dalam hal ini, skema operasi perpustakaan mengambil bentuk berikut:

Yaitu Setiap bentuk membuat aliran sendiri memproses tindakan aplikasi pengguna. Jika formulir baru dipanggil sebagai hasil dari pemrosesan tindakan, maka utas yang memanggilnya menunggu formulir ditutup, dan saat ini utas baru untuk memproses tindakan pengguna dibuat.
Contoh kode untuk bekerja dengan perpustakaan disajikan di bawah ini:
Contoh kerja JNDSComponentsForm jNDSComponentsForm = new JNDSComponentsForm(); jNDSComponentsForm.setTitle("Main form"); final JNDSLabel jndsLabel = new JNDSLabel("Simple label", 20, 30); jNDSComponentsForm.addComponent(jndsLabel); JNDSTextField jndsTextField = new JNDSTextField("Hello world", 20, 58, 150); jNDSComponentsForm.addComponent(jndsTextField); JNDSButton jndsButtonDialogForm = new JNDSButton("Show dialog form", 20, 90); JNDSAction jndsActionImplDialogForm = new JNDSAction() { public void action() { final JNDSDialogForm jndsDialogForm = new JNDSDialogForm(); jndsDialogForm.setTitle("Dialog form"); JNDSButton jndsButtonClose = new JNDSButton("Close", 10, 130); jndsButtonClose.setClickAction(new JNDSAction() { public void action() { jndsDialogForm.setVisible(false); } }); jndsDialogForm.addComponent(jndsButtonClose); JNDSLabel jndsLabelDialogForm = new JNDSLabel("This is Dialog Form!", 70, 80); jndsDialogForm.addComponent(jndsLabelDialogForm); jndsDialogForm.setVisible(true); } }; jndsButtonDialogForm.setClickAction(jndsActionImplDialogForm); jNDSComponentsForm.addComponent(jndsButtonDialogForm); jNDSComponentsForm.setVisible(true); JNDSWindowsManager.instance().run();
Seperti dalam Swing, tata letak formulir dan penangan tindakan pengguna pertama kali dijelaskan, dan kemudian kontrol ditransfer ke perpustakaan, yang menginisialisasi konteks dan membuat dan memproses klik pada layar sentuh.
Masalah lain yang saya temui adalah keyboard. Sayangnya, saya tidak menemukan cara untuk memanggil keyboard layar siap pakai dari sistem operasi. Karena itu, saya harus melakukan sendiri, implementasi yang sangat disederhanakan. Hasil karyanya disajikan di bawah ini:

Sebagai komponen saat ini saya hanya menerapkan Label, TextField dan Tombol. Sebagai contoh, saya cukup berpikir; penampilan bentuk yang dijelaskan di atas ditunjukkan pada gambar:

Kode sumber lengkap dapat ditemukan di
sini .
Luncurkan di perangkat nyata
Salin file * .class yang diperoleh sebagai hasil kompilasi ke kartrid flash, jalankan kvm.nds dan pilih ExampleJNDSWindowsManager.class di dalamnya.
Hasil dari aplikasi disajikan dalam video berikut:
Kesimpulan
Sebagai penutup, saya ingin mengucapkan terima kasih kepada pencipta Nintendo DS, pengembang port JVM untuk Nintendo DS, pencipta kartrid flash untuk kesempatan untuk mengembangkan perangkat keras favorit mereka, serta istri saya atas bantuannya dalam merekam video dan mengedit artikel ini.
Terima kasih atas perhatian Anda!