Προγραμματισμός

Java Tip 23: Γράψτε εγγενείς μεθόδους

Η ικανότητα να γράφετε μόνο ένα σύνολο κώδικα στην Java και να το εκτελείτε σε κάθε σύστημα με χρόνο εκτέλεσης Java είναι ένα από τα βασικά πλεονεκτήματα της Java. Αλλά αυτή η ανεξαρτησία της πλατφόρμας έχει ένα βασικό μειονέκτημα: Τι κάνουμε με τον τεράστιο όγκο του υπάρχοντος κώδικα; Το κόλπο είναι να χρησιμοποιήσετε το λεγόμενο εγγενής διεπαφή μεθόδου.

Η σύνταξη εγγενών μεθόδων περιλαμβάνει την εισαγωγή κώδικα C στην εφαρμογή Java. Σε αυτήν την συμβουλή θα σας καθοδηγήσω στη βασική συνταγή για τη δημιουργία εγγενών μεθόδων και τη χρήση τους σε μια εφαρμογή Java.

Επτά βήματα για τη μητρική μέθοδο nirvana Τα βήματα για τη δημιουργία εγγενών μεθόδων είναι τα εξής:

  • Γράψτε κώδικα Java
  • Μεταγλώττιση κώδικα Java
  • Δημιουργία κεφαλίδας C ( αρχείο)
  • Δημιουργία Γ στέλεχος αρχείο
  • Γράψτε κώδικα C
  • Δημιουργία κοινόχρηστης βιβλιοθήκης κώδικα (ή DLL)
  • Εκτελέστε την εφαρμογή

Η άσκησή μας είναι να γράψουμε κάποιο κείμενο στην κονσόλα μέσα από την εγγενή μέθοδο. Οι λεπτομέρειες αυτού του παραδείγματος θα προσανατολιστούν προς ένα σύστημα τύπου Unix, συγκεκριμένα το Linux. Θα επισημάνω τα σημεία όπου οι λεπτομέρειες διαφέρουν για άλλες πλατφόρμες.

Γράψτε κώδικα Java

Γράψτε τον κώδικα Java όπως θα κάνατε κανονικά. Για να χρησιμοποιήσετε εγγενείς μεθόδους στον κώδικα Java, πρέπει να κάνετε δύο πράγματα. Αρχικά, γράψτε μια δήλωση εγγενούς μεθόδου για κάθε εγγενή μέθοδο που θέλετε να χρησιμοποιήσετε. Αυτό είναι ακριβώς σαν να γράφετε τη δήλωση μιας κανονικής διεπαφής μεθόδου Java, αλλά πρέπει να καθορίσετε το ντόπιος λέξη-κλειδί, ως εξής:

δημόσιο εγγενές άκυρο printText (); 

Το δεύτερο στεφάνι για να περάσετε είναι ότι πρέπει να φορτώσετε ρητά τη μητρική βιβλιοθήκη κώδικα. (Θα το δημιουργήσουμε αργότερα.) Το κάνουμε αυτό φορτώνοντας τη βιβλιοθήκη σε ένα στατικό μπλοκ κατηγορίας:

στατικό {System.loadLibrary ("happy"); } 

Για να συνδυάσετε αυτά τα κομμάτια για παράδειγμα, δημιουργήστε ένα αρχείο που ονομάζεται Happy.java με τα ακόλουθα περιεχόμενα:

τάξη Happy {public native void printText (); στατικό {System.loadLibrary ("happy"); / * Σημείωση πεζά του ονόματος τάξης! * /} δημόσιος στατικός κενός κενός (String [] args) {Happy happy = new Happy (); happy.printText (); }} 

Μεταγλώττιση κώδικα Java

Συντάξτε το Happy.java αρχείο:

% javac Happy.java 

Δημιουργήστε ένα αρχείο κεφαλίδας C

Υπάρχουν διάφορες μαγικές πινελιές που πρέπει να διατίθενται έτσι ώστε ο κωδικός C να μπορεί να χρησιμοποιηθεί ως εγγενής μέθοδος. ο javah Η λειτουργικότητα του μεταγλωττιστή Java θα δημιουργήσει τις απαραίτητες δηλώσεις και παρόμοιες από μας Χαρούμενος τάξη. Αυτό θα δημιουργήσει ένα Χαρούμενος αρχείο για να συμπεριλάβουμε στον κωδικό C:

% javah Ευτυχισμένος 

Δημιουργήστε ένα αρχείο C stubs

Με τρόπο που θυμίζει το mangling που κάνουν οι μεταφραστές C ++ στα ονόματα των μεθόδων C ++, ο μεταγλωττιστής Java έχει παρόμοια τρέλα. Για να διευκολυνθεί ο πόνος που πρέπει να γράψουμε πολύ κουραστικό κώδικα έτσι ώστε ο κώδικας C να μπορεί να κληθεί από το σύστημα χρόνου εκτέλεσης Java, ο μεταγλωττιστής Java μπορεί να δημιουργήσει αυτόματα τον απαραίτητο κωδικό τραμπολίνο για εμάς:

% javah -stubs Χαρούμενος 

Γράψτε κώδικα C

Τώρα, ας γράψουμε τον πραγματικό κώδικα για να εκτυπώσουμε τον χαιρετισμό μας. Συνήθως, βάζουμε αυτόν τον κώδικα σε ένα αρχείο που ονομάζεται από την κλάση Java με τη συμβολοσειρά "Imp" που επισυνάπτεται σε αυτό. αυτο εχει ως αποτελεσμα HappyImp.c. Τοποθετήστε τα ακόλουθα HappyImp.c:

#include & ltStubPreamble.h> / * Βασική μέθοδος εγγενών μεθόδων. * / #include "Happy.h" / * Δημιουργήθηκε νωρίτερα. * / #include & ltstdio.h> / * Τυποποιημένα πράγματα C IO. * / void Happy_printText (struct HHappy * this) {βάζει ("Ευτυχισμένο το Νέο Έτος !!!"); } 

Κατά τη διασύνδεση του κώδικα C με Java, εμπλέκονται πολλές άλλες πτυχές - όπως πώς να περάσετε και να επιστρέψετε μυριάδες τύπους. Για περισσότερες πληροφορίες, ανατρέξτε στο πρόγραμμα εκμάθησης Java ή στο έγγραφο Hermetica Native Methods (ανατρέξτε στην ενότητα Πόροι για διευθύνσεις URL).

Δημιουργήστε μια κοινόχρηστη βιβλιοθήκη

Αυτή η ενότητα εξαρτάται περισσότερο από το σύστημα. Φαίνεται ότι κάθε πλατφόρμα και κάθε συνδυασμός μεταγλωττιστή / συνδέσμου έχει διαφορετική μέθοδο δημιουργίας και χρήσης κοινόχρηστων βιβλιοθηκών. Για άτομα που χρησιμοποιούν οποιαδήποτε από τις διάφορες πλατφόρμες των Microsoft Windows, ανατρέξτε στην τεκμηρίωση του μεταγλωττιστή C για τις λεπτομέρειες.

Για εσάς Linux, δείτε πώς μπορείτε να δημιουργήσετε μια κοινόχρηστη βιβλιοθήκη χρησιμοποιώντας το GCC. Αρχικά, συντάξτε τα αρχεία πηγής C που έχουμε ήδη δημιουργήσει. Πρέπει να πείτε στον μεταγλωττιστή πού να βρείτε τα αρχεία υποστήριξης της εγγενούς μεθόδου Java, αλλά το κύριο κόλπο εδώ είναι ότι πρέπει να πείτε ρητά στον μεταγλωττιστή να παράγει Πδιάθεση Εγώανεξάρτητα ντοωδή:

% gcc -I / usr / local / java / include -I / usr / local / java / include / genunix -fPIC -c Happy.c HappyImp.c 

Τώρα, δημιουργήστε μια κοινόχρηστη βιβλιοθήκη από τα αρχεία αντικειμένου (.o) που προκύπτουν με την ακόλουθη μαγική ανάδειξη:

% gcc -shared -Wl, -soname, libhappy.so.1 -o libhappy.so.1.0 Happy.o HappyImp.o 

Αντιγράψτε το κοινόχρηστο αρχείο βιβλιοθήκης στο τυπικό σύντομο όνομα:

% cp libhappy.so.1.0 libhappy.so 

Τέλος, ίσως χρειαστεί να πείτε στον δυναμικό σύνδεσμο σας πού να βρείτε αυτό το νέο αρχείο κοινόχρηστης βιβλιοθήκης. Χρησιμοποιώντας το κτυπώ δυνατά κέλυφος:

% εξαγωγή LD_LIBRARY_PATH = `pwd`: $ LD_LIBRARY_PATH 

Εκτελέστε την εφαρμογή

Εκτελέστε την εφαρμογή Java ως συνήθως:

% java Ευτυχισμένος 

Λοιπόν, αυτό είναι μόνο αυτό. Χάρη στον Tony Dering για τη μετάδοση των παραπομπών για Linux.

Μια γρήγορη σχεδίαση

Πριν βιαστώ να γράψω εγγενείς μεθόδους για όλο αυτόν τον παλαιό κώδικα, θα ήθελα να προειδοποιήσω όλους να κοιτάξουμε προσεκτικά τα υπάρχοντα συστήματα και να δούμε αν υπάρχουν καλύτεροι τρόποι να τα συνδέσουμε με την Java. Για παράδειγμα, υπάρχουν Java Database Connectivity (JDBC) και ακόμη υψηλότερου επιπέδου λύσεις για πρόσβαση σε βάσεις δεδομένων από Java. Λοιπόν, κοιτάξτε όλα τα κόλπα στην τσάντα σας και χρησιμοποιήστε ό, τι έχει νόημα για το έργο στο χέρι.

Μάθετε περισσότερα σχετικά με αυτό το θέμα

  • JavaSoft Native Method Tuturial //www.javasoft.com/books/Series/Tutorial/native/implementing/index.html
  • Έγγραφο εγγενών μεθόδων Hermetica //www.hermetica.com/technologia/java/native/

Αυτή η ιστορία, "Java Συμβουλή 23: Γράψτε εγγενείς μεθόδους" δημοσιεύθηκε αρχικά από το JavaWorld.