Alles, was in dem Artikel gesagt wird, wird ausschließlich für 1C-Entwickler interessant sein.Heute werden wir die externe Komponente für "1C Mobile Application" analysieren. Dieser Artikel erschien aus zwei Gründen. Wir werden alles unter dem gleichen ATOL Smart.Lite entwickeln
- Die Entwicklung einer nativen Anwendung erwies sich als viel komplizierter als ursprünglich gedacht.
- Speziell für die externe Komponente für 1C gingen mehrere Anfragen ein
Zuvor hatte ich bereits Erfahrung mit dem Schreiben von externen
c++
Komponenten. Und es gibt sogar eine
Vorlage für die x86-Plattform. Es wurde ohne Verständnis von
c++
. Trotzdem funktioniert es in zwei Projekten und fällt nicht aus. Wir gehen zum Kern des Problems über. Benötigen Sie eine native Komponente, um Broadcast-Nachrichten in 1C zu empfangen. Wir werden das Internet durchgehen und verstehen, dass es fertige Lösungen gibt. Aber sie sind alle auf meiner weniger beliebten Seite, wegen übermäßiger Gier. Und ich wollte nicht für die Blackbox bezahlen. Dennoch ist dort ein
hervorragender Artikel „Externe Komponenten der 1C Mobile-Plattform für das Android-Betriebssystem“ aufgetaucht. Es wird beschrieben, wie Sie eine mobile Version einer Komponente formen und welche Komponenten installiert werden müssen. Soweit ich weiß, finden Sie
hier den Quellcode für den obigen Artikel. Vielen Dank an den freundlichen Mann für seine Bemühungen. Es hat mir sehr geholfen, anhand eines lebendigen Beispiels zu verstehen, was und wie es funktioniert. Dann musste ich meinen Horizont etwas erweitern, wie JNI funktioniert. Einfach und klar
hier und
hier . Ich empfehle Ihnen, sich mit ihnen vertraut zu machen. Ich bin sicher, dass echte C ++ - Programmierer meinen Code nicht mögen werden. Ich bitte Sie, nachsichtig zu sein und zu stoßen, was verbessert werden kann und korrekter zu schreiben.
Fangen wir an. Ich habe den Quellcode aus dem Repository genommen, das ich zuvor angegeben habe, und ihn fast vollständig an meine Bedürfnisse angepasst. Sie können es
hier nehmen . Gehen wir die Hauptpunkte durch. Die Hauptprozedur für uns ist
startEventsWatch
Wir überprüfen, ob
BroadcastReceiver
angeschlossen ist und definieren die Funktion
onReceive
neu
onReceive
Dort schauen wir, welches Ereignis zu uns gekommen ist, füllen die Felder aus und rufen die Funktion
OnBroadcastReceive
Jetzt ist es die Verbindungsfunktion zwischen Java und C + + und entführt uns aus der Welt von Android in die Welt von 1C. Dazu später mehr. Die geschätzten Linien dessen, was wir in 1C bekommen wollen, sehen so aus.
filter.addAction("com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST"); filter.addAction(NEW_KEY_UP);
Es wird beschrieben, dass wir ein Ereignis vom Scanner erwarten. In meinem Fall ist das
com.xcheng.scanner...
In Ihrem Fall gibt es je nach Scanner eine weitere Zeile. Dementsprechend sind auch die Daten in der Nachricht unterschiedlich. Diese Daten sind in der Regel beim Hersteller der TSD erhältlich. Na ja, oder schauen Sie sich logcat an. Ich wollte auch Hardware-Tastendruckcodes erhalten. Aber das Problem wurde nicht in der Stirn gelöst. Das Hinzufügen von
onKeyUP
zum Code und das Senden an
sendBroadcast
war nicht erfolgreich. Es ist nicht verwunderlich, dass unsere Tätigkeit nicht im Vordergrund steht. Aus diesem Grund musste ich schnell
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); } }
Nun zurück zu unseren Daten, die in 1C gesendet wurden. Unser
OnBroadcastReceive
ruft die
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
Dies sind die Variablen, in die ich übergebe, das Ereignis, die Art des
jstring j_event, jstring j_type, jstring j_data
selbst. Möglicherweise sind andere Daten vorhanden.
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);
Damit übersetzen wir den String von
jstring
nach
std::wstring
und packen ihn dann für 1C
WcharWrapper wmsg((wchar_t*)ws_event.c_str());
Vielen Dank an die kluge Person für die Konvertierungsfunktion. Die zweite Funktion stammt aus der Box im Beispiel von 1C.
Spoiler Überschrift 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; }
Für diejenigen, die nicht alles installieren und selbst kompilieren wollen. Hier sind die fertigen Veröffentlichungen.
Das ist alles. Warten auf Kommentare.