2016-03-09 1 views
0

Je voudrais que mon code natif fait exactement la même chose que suivant le code Java sur Android:Comment implémenter l'interface Java sous JNI

Intent i = new Intent(); 
i.setClassName("com.example.someservice", "com.example.someservice.service"); 
bindService(i, clientConnection, Context.BIND_AUTO_CREATE); 

Mais clientConnection est une interface ServiceConnection en Java. Comment pourrais-je implémenter l'interface en code natif?

Répondre

1

Vous ne pouvez pas utiliser Binder car il ne fait pas partie des API NDK. Regardez dans les docs NDK/STABLE-APIS.html pour la liste complète des API stables, et this thread pour un commentaire explicite de David Turner (le mainteneur NDK) que Binder n'est pas une API supportée.

Vos options sont:

  • Utilisez une autre forme de l'IPC en code natif - par exemple un socket de domaine UNIX
  • Faites-en Java, en utilisant les Service normales et des installations AIDL du SDK Android. Si vous souhaitez combiner ceci avec du code natif, vous pouvez appeler Java à partir du code natif en utilisant JNI.
  • (Non recommandé) Copiez les bibliothèques et les en-têtes pertinents d'un projet Android Open-Source; intégrer dans votre projet NDK; et utilisez les API. Cependant, ceci n'est pas officiellement supporté et il est fort probable qu'il casse votre application dans les prochaines versions car Google n'est pas obligé de maintenir la compatibilité dans de telles bibliothèques (et souvent non). C'est aussi très difficile, car vous devez trouver un moyen d'enregistrer le service de sorte que le client puisse le trouver.