2010-01-14 8 views
2

Ayant mon propre code Java J'utilise C# pour appeler du code non managé qui appelle (via JNI) le code java. J'utilise JNI depuis que je dois assurer:Appelez mon propre code Java de C#

  • la capacité que le code Java fonctionnera sur réel JVM et non pas sur une machine virtuelle .NET
  • la possibilité de joindre à la machine virtuelle pour le débogage (IKVM ne « soutenir nt il)
  • J'ai besoin solution
  • libre les solutions libres actuelles ne sont pas applicables (par exemple IKVM)

Quoi qu'il en soit, ma question est de savoir comment puis-je gérer les chaînes passées entre ces couches de la meilleure façon sans fuites. que je fais quelque chose comme:

[DllImport(@"MyDll.dll")] 
public extern static void receive_message(string receDest, StringBuilder response); 

Cela signifie que je suis allocation de la mémoire pour la réponse dans le code managé. Je veux éviter cela car je ne connais pas la longueur de la réponse. Comment puis-je écrire une méthode appropriée JNI qui va allouer le bon tampon pour le code managé sans fuites. Le code JNI doit être thread-safe.

Des suggestions?

Merci,

Guy

Répondre

6

Vous peut besoin JNI, mais vos besoins ne vraiment pas l'indiquer.

L'exigence de utiliser un vrai JVM ne dicte pas l'utilisation de JNI. Je suggérerais d'aiguiser vos exigences ou d'envisager un couplage plus lâche. Par exemple, socket comms, services Web, une base de données partagée, un fichier partagé ou a queue.

Si vous avez vraiment besoin de Java et .NET pour être exécutés dans le même processus, avec un couplage serré, pensez à JNBridge.
Ils ont résolu le problème auquel vous êtes confronté.

+0

1. JNBridge n'est pas gratuit. 2. Je n'ai pas compris comment je peux configurer la JVM. 3. Dans leurs exemples, vous devez charger la JVM par vous-même (en appelant le Java directement) Merci, Guy – Guy

+1

Je comprends que JNI n'est pas gratuit. Je n'ai pas vu cela comme une exigence. Combien vaut votre temps? – Cheeso

+2

+1 pour la suggestion de rester simple en utilisant des sockets pour communiquer entre les deux processus. – Mark

2

Vous pourriez être intéressé à essayer de convertir votre code de bytecode Java en .NET CIL avec IKVM.NET.

+0

Ce n'est pas une option depuis: 1. J'ai besoin que le code Java soit en Java et j'ai besoin de le déboguer. 2. Je ne veux pas utiliser VM autre que "réelle" JVM (pas IKVM) Merci, – Guy

1

Vous devez essentiellement effectuer un appel distant dans le programme Java à partir de votre code .NET. Avec votre compétence actuelle, je vous suggère de créer un service web dans la machine Java - c'est relativement facile dans Java 6 - et basé sur le WSDL créer un client dans votre programme .NET.

Ceci est probablement la solution la plus propre avec les technologies d'aujourd'hui.

Si pour une raison quelconque, ce n'est pas suffisant, alors ajoutez à votre question.

0

Je pense que vous pourriez utiliser jni4net comme une bibliothèque de pont. Ou vous pouvez juste regarder le code source et récupérer quelques idées (LGPL/GPL).

1

Guy - En ce qui concerne la réponse de Cheeso et vos respones lui:

  • JNBridgePro ne permet la machine virtuelle Java pour démarrer automatiquement et exécuté à l'intérieur du processus .NET (en plus de la possibilité de démarrer explicitement). Voir le mécanisme de communication "à mémoire partagée" discuté dans la documentation. JNBridgePro vous permet d'attacher un débogueur Java, même lorsque la JVM est exécutée dans le processus .NET. Contactez [email protected] pour plus de détails, ainsi que pour plus de détails sur la configuration de la JVM. Je ne peux pas faire grand-chose à ce sujet n'étant pas gratuit, mais il peut être utile de votre temps pour le vérifier quand même.

Divulgation: Oui, je suis avec JNBridge.