Einschränkungen des Android NDK?

Lesezeit: 4 Minuten

Ich habe eine Frage zu den Einschränkungen dessen, was Sie mit nativem Code auf der Android-Plattform tun können.

Im Grunde habe ich eine Bibliothek in nativem C-Code entwickelt, die UDP-Sockets für SIP/RTP verwendet und OpenAL für die Audioaufzeichnung/-wiedergabe nutzt – im Grunde die gesamte Anwendung. Die Idee besteht darin, so viel wie möglich in nativem C-Code statt in Java-Code zu haben. Ich möchte dies tun, weil ich es auch auf anderen Plattformen verwenden werde.

Meine Frage lautet dann einfach: Ist es möglich, nur Java für die GUI zu verwenden und dann die gesamte Verarbeitung im nativen Code durchzuführen? Was passiert, wenn mein nativer Code versucht, einen Socket zu erstellen, ihn zu binden, Audio aufzunehmen, abzuspielen usw. – Da es sich um nativen Code handelt, muss ich Berechtigungen dafür einrichten (z. B. Zugriff der Anwendung auf das Mikrofon usw.) oder werde ich das tun? Es umgeht dieses Zeug einfach, da es sich um einen nativen Code handelt? Kann nativer Code auf Android so ziemlich alles tun, was er will, genau wie auf PCs?

Tut mir leid, wenn es unklar ist. Sag es einfach und ich werde versuchen, es zu verbessern

Danke

EboMikes Benutzeravatar
EboMike

Sie können in nativem Code so ziemlich alles tun, was Sie wollen, aber das einzige, was auf Betriebssystemebene wirklich unterstützt wird, sind OpenGL, OpenSL und einige Bibliotheken zur Zahlenverarbeitung (Komprimierung, Mathematik usw.).

Es steht Ihnen jedoch jederzeit frei, die JNI zum Aufrufen einer Java-Methode zu verwenden, sodass Sie die Standard-Android-API für Netzwerke verwenden können (Klassen wie Socket, usw). Da der Aufruf über die Java-API erfolgt, gelten natürlich alle normalen Android-Berechtigungen (z. B android.permission.INTERNET).

BEARBEITEN: Wie in den Kommentaren erläutert, unterstützen die Standardbibliotheken, die Teil des NDK sind, Sockets.

  • Könnten Sie näher erläutern, was Sie unter „unterstützt“ verstehen? Ich kann beispielsweise keine Sockets in der NDK-Bibliotheksliste finden. Kann ich sie trotzdem verwenden? Welche Header-Dateien und anderes Zeug verwenden Sie – gibt es keine Sys/Sockets?

    – KaiserJohaan

    12. Juli 2011 um 1:01

  • Das wird Ihnen nicht gefallen, aber … Sie müssen Java verwenden, dh Sie verwenden FindClass Socketdann holen Sie sich die Methode für den Konstruktor, die Methode für readdie Methode für writespeichern Sie den Socket als jobject in Ihrem Code, und Sie verwenden CallVoidEnvMethod oder etwas ähnliches. Es klingt absolut schrecklich, aber Sie können eine dünne Schicht schreiben, die zwischen C und Java übersetzt, und am Ende nur eine Handvoll dieser Übersetzungsfunktionen haben.

    – EboMike

    12. Juli 2011 um 1:05

  • Übrigens gibt es, wie Kazuki betonte, möglicherweise volle Unterstützung für die Socket-API, aber ich persönlich habe diese Indirektion immer über Java verwendet.

    – EboMike

    12. Juli 2011 um 1:06

  • @EboMike, Sie liegen falsch mit der Behauptung, dass Sockets JNI erfordern. Zusammen mit den meisten anderen Standard-Unixismen können sie aus nativem Code erstellt werden. Es handelt sich hauptsächlich um UI- und andere Android-Dienste, für die JNI erforderlich ist.

    – Chris Stratton

    12. Juli 2011 um 3:42


  • Ich verwende die Curl-C-Bibliotheken problemlos in einem Daemon, den ich für Android geschrieben habe (reiner nativer Code). Als ich den Code mithilfe von JNI-Aufrufen in eine Java-Android-App eingebunden habe, lief er weiterhin einwandfrei. Sie benötigen jedoch die INTERNET-Berechtigung in AndroidManifest.xml, sonst schlägt der Aufruf fehl, unabhängig davon, ob sich die App in /data/app oder / befindet. System/App.

    – Colin

    5. April 2015 um 23:47 Uhr

Benutzeravatar von jglouie
jglouie

Sie benötigen weiterhin Berechtigungen für Ihre Anwendung. Beispielsweise funktionieren Ihre nativen Steckdosen nicht ohne android.permission.INTERNET im Manifest.

<manifest xlmns:android...>
 ...
 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

Eine andere Möglichkeit besteht darin, den Socket auf der Java-Ebene zu erstellen und ihn weiterzugeben. Hier ist ein Beispiel für die Interaktion mit dem Socket im Heimatland, siehe Methode org_..._OpenSSLSocketImpl_connect():

http://www.netmite.com/android/mydroid/dalvik/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSocketImpl.cpp

Die native Android-API ist ein schöner Artikel für NDK.

Ist es möglich, nur Java für die GUI zu verwenden und dann die gesamte Verarbeitung im nativen Code durchzuführen?

Ja. Und Sie müssen die entsprechenden Berechtigungen für Ihr AndroidManifest festlegen.

Audio aufnehmen, abspielen,

Sie müssen die OpenSL ES-API zum Aufzeichnen und Abspielen von Audio auf der nativen Seite verwenden. Das bedeutet, dass Ihre Anwendung für Android 2.3 oder höher sein sollte.

Oder NVIDIA stellt ein Framework bereit, das es uns ermöglicht, mithilfe von C++ Ereignisse, Sensoren, Audio usw. für Android zu entwickeln, selbst wenn es sich um Android 2.2 oder früher handelt.

Tegra-Ressourcen – Android SDK- und NDK-Beispielanwendungen und Dokumentation

  • Wird OpenAL von Android nicht unterstützt? Ich glaube, ich habe irgendwo darüber gelesen, oder dass man einfach die gemeinsam genutzte OpenAL-Bibliothek in die APK einbinden kann?

    – KaiserJohaan

    12. Juli 2011 um 1:34

  • OpenAL-Softwareimplementierung für Android. Da es sich um eine Softwareimplementierung handelt, ist OpenSL ES effizienter als diese OpenAL-Implementierung.

    – Kazuki Sakamoto

    12. Juli 2011 um 1:43

Vielleicht möchten Sie einen Blick darauf werfen csipsimple Dies ist ein Beispiel für die Verwendung von pjsip SIP-Bibliothek (die in C geschrieben ist) in einer Java-Android-Anwendung.

Ich habe nicht untersucht, wie die Sockets-Kommunikation funktioniert, aber es sollte Ihnen ein umfassenderes Beispiel dafür geben, was Sie zu tun versuchen.

1453260cookie-checkEinschränkungen des Android NDK?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy