2017-07-20 2 views
1

Je suis nouveau à Android NDK, et je lisais these tips sur le site développeur Android. Il recommande d'utiliser JNI_OnLoad pour enregistrer vos méthodes natives, mais ne donne pas beaucoup de détails sur la façon de procéder.Est-ce que JNI_OnLoad est normalement utilisé pour Android NDK?

En recherchant Google's NDK sample repo on GitHub, vous n'avez activé qu'une utilisation de JNI_OnLoad et n'appelle pas RegisterNatives. La recherche sur le web n'a pas beaucoup augmenté sur la façon de le faire non plus. Je sens qu'il me manque quelque chose. Ceci est censé être la bonne façon de le faire, selon Google, mais leurs propres exemples utilisent plutôt l'approche de dénomination de la méthode "découverte".

Est-ce que c'est peut-être une vieille façon de le faire, ce n'est plus vraiment fait?

Répondre

2

RegisterNatives est entièrement pris en charge sur Android, et la bonne façon de le faire est de JNI_OnLoad, qui fonctionne aussi bien et est shown prominently in NDK documentation. Il y a peu de raisons d'utiliser RegisterNatives par rapport à la résolution automatique habituelle des méthodes natives par l'appariement des noms (toujours utiliser javah pour obtenir les noms corrects).

  1. Lorsque vous avez beaucoup des méthodes natives, vous voudrez peut-être de ne pas avoir une grande table de fonction exportée dans votre bibliothèque partagée. L'utilisation de la correspondance automatique facilite l'ingénierie inverse et le piratage de votre bibliothèque partagée.

  2. Vous pouvez créer une logique personnalisée pour faire correspondre les méthodes natives à l'exécution.

  3. @CriticalNative Les méthodes doivent être enregistrées avec RegisterNatives au lieu de s'appuyer sur la liaison dynamique JNI.

Aucune de ces raisons ne s'applique aux exemples pratiques et aux didacticiels d'introduction.

+0

Oui, le lien que vous avez fourni correspond à la même partie de la documentation à laquelle je faisais référence. Je mettrai à jour mon lien pour pointer directement sur cette sous-section. Il y a beaucoup de détails qui manquent, cependant, et je n'ai pas pu les trouver dans mes recherches en ligne; ce qui m'a amené à me demander pourquoi c'est le cas. Pouvez-vous me montrer un exemple ou un tutoriel détaillé où 'JNI_OnLoad' est utilisé? J'accepterai cependant cette réponse, car elle répond à la question posée. Merci pour les idées. – orodbhen

+0

pas un tutoriel, mais beaucoup d'opensource: [simple] (https://android.googlesource.com/platform/development/+/master/samples/SimpleJNI) ou [plus avancé] (https: //chromium.googlesource. com/externe/webrtc/+/maître/modules/audio_device/android/audio_manager.cc). –