Semua yang dikatakan dalam artikel ini akan menarik secara eksklusif untuk pengembang 1C.Hari ini kita akan menganalisis komponen eksternal untuk "Aplikasi Seluler 1C". Artikel ini muncul karena dua alasan. Kami akan mengembangkan semuanya di bawah ATOL Smart.Lite yang sama
- Mengembangkan aplikasi asli ternyata jauh lebih rumit daripada yang saya pikirkan.
- Beberapa permintaan diterima secara khusus untuk komponen eksternal untuk 1C
Sebelum itu, saya sudah memiliki pengalaman menulis komponen eksternal
c++
. Dan bahkan ada
template untuk platform x86. Itu ditulis tanpa pemahaman
c++
. Namun demikian, ia bekerja di dua proyek, dan tidak jatuh. Kami melewati esensi masalah. Perlu komponen asli untuk menerima pesan Siaran dalam 1C. Kami akan pergi melalui Internet dan memahami bahwa ada solusi yang sudah jadi. Tapi mereka semua ada di situs saya yang tidak terlalu favorit, untuk keserakahan yang berlebihan Dan saya tidak mau membayar untuk kotak hitam. Namun demikian,
artikel yang sangat bagus "Komponen eksternal dari platform seluler 1C untuk OS Android" muncul di sana. Ini menjelaskan cara mencetak versi komponen seluler, dan apa yang perlu dipasang. Seperti yang saya pahami,
berikut adalah kode sumber untuk artikel di atas. Banyak terima kasih kepada pria yang baik hati atas usahanya. Ini sangat membantu dengan contoh hidup untuk memahami apa dan bagaimana cara kerjanya. Kemudian saya harus sedikit memperluas wawasan saya bagaimana cara kerja JNI. Sederhana dan jelas di
sini dan di
sini . Saya sarankan Anda membiasakan diri dengan mereka. Saya yakin bahwa programmer nyata c + + tidak akan menyukai kode saya. Saya meminta Anda untuk memanjakan dan menyodok apa yang bisa diperbaiki dan menulis lebih benar.
Mari kita mulai. Saya mengambil kode sumber dari repositori yang saya sebutkan sebelumnya, dan hampir sepenuhnya mengubahnya agar sesuai dengan kebutuhan saya. Anda bisa membawanya ke
sini . Mari kita bahas poin utama. Prosedur utama bagi kami adalah
startEventsWatch
Di dalamnya, kami memeriksa bahwa kami tidak memiliki
BroadcastReceiver
terhubung dan mendefinisikan kembali fungsi
onReceive
Di sana kami melihat acara apa yang datang kepada kami, mengisi bidang, dan memanggil fungsi
OnBroadcastReceive
dan sekarang ini merupakan fungsi penghubung antara java dan C + + dan membawa kita dari dunia Android ke dunia 1C. Lebih lanjut tentang ini nanti. Garis yang disukai dari apa yang ingin kita dapatkan di 1C terlihat seperti ini.
filter.addAction("com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST"); filter.addAction(NEW_KEY_UP);
Ini menjelaskan bahwa kami mengharapkan suatu peristiwa dari pemindai. Dalam kasus saya, ini adalah
com.xcheng.scanner...
Dalam kasus Anda, tergantung pada pemindai, akan ada garis lain. Dengan demikian, data di dalam pesan juga akan berbeda. Sebagai aturan, data ini dapat diperoleh dari pabrikan TSD. Baik, atau lihat logcat. Saya juga ingin menerima kode tombol tekan perangkat keras. Namun masalah itu tidak terpecahkan di dahi. Hanya menambahkan
onKeyUP
ke kode dan mengirimkannya ke
sendBroadcast
tidak berhasil. Tidak mengherankan, Aktivitas kami tidak di latar depan. Untuk alasan ini, saya harus dengan cepat membuang
AccessibilityService
startEventsWatch public void startEventsWatch() { if (m_Receiver==null) { m_Receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent != null) { String event, type, data; switch (intent.getAction()) { case "com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST": event = "NewBarcode"; type = intent.getStringExtra("EXTRA_BARCODE_DECODING_SYMBOLE"); data = intent.getStringExtra("EXTRA_BARCODE_DECODING_DATA"); OnBroadcastReceive(m_V8Object, event, type, data); break; case NEW_KEY_UP: event = "NewKeyUP"; type = "key"; data = intent.getStringExtra(KEY_CODE); OnBroadcastReceive(m_V8Object, event, type, data); } } } }; IntentFilter filter = new IntentFilter(); filter.addAction("com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST"); filter.addAction(NEW_KEY_UP); m_Activity.registerReceiver(m_Receiver, filter); } }
Sekarang kembali ke pengiriman data kami dalam 1C.
OnBroadcastReceive
kami memanggil
extern "C" JNIEXPORT void JNICALL Java_org_innovait_atolsmartliteutils_MainApp_OnBroadcastReceive(JNIEnv* env, jclass jClass, jlong pObject, jstring j_event, jstring j_type, jstring j_data)
we work with
extern "C" JNIEXPORT void JNICALL Java_org_innovait_atolsmartliteutils_MainApp_OnBroadcastReceive(JNIEnv* env, jclass jClass, jlong pObject, jstring j_event, jstring j_type, jstring j_data)
.
jstring j_event, jstring j_type, jstring j_data
Ini adalah variabel di mana saya lulus, acara, jenis
jstring j_event, jstring j_type, jstring j_data
itu sendiri. Mungkin ada data lain.
Java_org_innovait_atolsmartliteutils_MainApp_OnBroadcastReceive extern "C" JNIEXPORT void JNICALL Java_org_innovait_atolsmartliteutils_MainApp_OnBroadcastReceive(JNIEnv* env, jclass jClass, jlong pObject, jstring j_event, jstring j_type, jstring j_data) { IAddInDefBaseEx *pAddIn = (IAddInDefBaseEx *) pObject; if (pAddIn != nullptr) { std::wstring ws_event =ToWStringJni(j_event); std::wstring ws_type = ToWStringJni(j_type); std::wstring ws_data = ToWStringJni(j_data); std::wstring obj_data{}; obj_data = L"{\"type\": \"" + ws_type + L"\", \"data\": \"" + ws_data + L"\"}"; WcharWrapper wdata((wchar_t*)obj_data.c_str()); WcharWrapper wmsg((wchar_t*)ws_event.c_str()); pAddIn->ExternalEvent(s_EventSource, wmsg, wdata); } }
std::wstring ws_event =ToWStringJni(j_event);
Dengan ini kita menerjemahkan string dari
jstring
ke
std::wstring
, dan kemudian kita kemas semuanya untuk 1C
WcharWrapper wmsg((wchar_t*)ws_event.c_str());
Terima kasih kepada orang pintar untuk fungsi konversi. Fungsi kedua berasal dari kotak dalam contoh dari 1C.
Judul spoiler std::wstring ToWStringJni(jstring jstr) { std::wstring ret; if (jstr) { JNIEnv* env = getJniEnv(); const jchar* jChars = env->GetStringChars(jstr, NULL); jsize jLen = env->GetStringLength(jstr); ret.assign(jChars, jChars + jLen); env->ReleaseStringChars(jstr, jChars); } return ret; }
Bagi mereka yang tidak ingin menginstal semuanya dan kompilasi sendiri. Ini adalah rilis yang sudah selesai.
Itu saja. Menunggu komentar.