z/OS üzerinde paylaşılan kitaplıkları kullanma örneği
Bu örnek, z/OS® sistemlerinde Java™ uygulamasıyla yerel paylaşılan kitaplıkları kullanma sürecinde size yol gösterir.
Yordam
- Örnek bir uygulama oluşturun Sample.java:
public class Sample { /** * A static class initialization block that is run when this class * is first loaded. Here, try to load the target libSample.so shared library * that implements the printFromNative() method declared later. */ static { try { System.loadLibrary("Sample"); } catch (Throwable e) { throw new RuntimeException(e); } } /** * Prints a message to STDOUT. * The 'native' keyword indicates that this method is implemented in native code, * callable through the Java Native Interface (JNI). */ public static native void printFromNative(); public static void main(String[] args) { // Invoke the native method Sample.printFromNative(); } }Bu Java uygulaması durağan yerli bir yöntemi (
Sample.printFromNative()) bildirir ve bu yerli yöntemimainyönteminden çağırır.Samplesınıfı ilk yüklendiğinde çalıştırılan statik sınıf kullanıma hazırlama öbeği sırasında, hedef yerli kitaplık (libSample.so)System.loadLibrary("Sample")çağrısı tarafından yüklenir.Not: API, belirttiğiniz kitaplık adınaliböneki ve.sosonekini ekler ve SDK,LIBPATHortam değişkeninin belirlediği kitaplık yolu içinde hedef paylaşılan kitaplığı arar. Hedef yerel paylaşılan kitaplığınız bir MVS™ veri kümesiyse ya da belirli bir mutlak yola ya da kitaplık adına sahipseniz, bunun yerine API ' yi kullanın. - Uygulamanın Java bölümü tamamlandı, artık derleyebilirsiniz:
javac Sample.java - Yerel kod için üstbilgi dosyası oluşturmak üzere
javahkomutunu kullanın:
Bu komut, yerli uygulama uygulamanız için uygun JNI yöntemi imzalarıylajavah SampleSample.hadlı bir C üstbilgi dosyası oluşturur. -
Sample.cadlı bir dosya oluşturun:
Bu dosya, Java#include <stdio.h> #include "Sample.h" JNIEXPORT void JNICALL Java_Sample_printFromNative(JNIEnv * env, jclass cls) { printf( "Printing from native\n" ); }Sample.printFromNative()yönteminin C yerel somutlamasını sağlar. - Derle
Sample.c, bağla ve bir Java uygulamasından dinamik olarak yüklenebilecek ve çağrılabilecek bir paylaşılan kitaplığa bağlalibSample.so. Örneğin:31 bit uygulamalar için:
Buradaxlc -o libSample.so -W "l,xplink,dll" -W "c,langlvl(extended),float(ieee),xplink,dll,exportall" -I/javahome/include Sample.c /javahome/lib/s390x/j9vm/libjvm.xjavahome, IBM SDK kuruluşunuzun JAVA_HOME yoludur.64 bit uygulamalar için:
Buradaxlc -q64 -o libSample.so -W "l,xplink,dll" -W "c,langlvl(extended),float(ieee),xplink,dll,exportall" -I/javahome/include Sample.c /javahome/lib/s390x/j9vm/libjvm.xjavahome, IBM SDK kuruluşunuzun JAVA_HOME yoludur.Derleme ve bağ komutlarındaki öğeler aşağıdaki gibidir:- xlc
- C derleyicisini çalıştıran komut.
- -q64
- (yalnızca 64 bit). Derleyiciye AMODE64 altyapıları için hedef paylaşılan kitaplığı derlemesini bildirir.
- -o libSample.so
- Oluşturmak istediğiniz paylaşılan kitaplık olan çıkış dosyası. Ad (
libile.soarasındaki metin),System.load(filename)ya daSystem.loadLibrary(filename)Java API ' larına sağladığınız adla eşleşmelidir. - -W "l, xplink, dll"
-Wseçeneği, derleyicinin bağlantı aşamasına geçirilir. Bağlantı oluşturucu paylaşılan bir kitaplık .dll dosyası oluşturur ve yüksek başarımlı bağlantı XPLINK ' i kullanır.- -W "c, langlvl (genişletilmiş), float (ieee), xplink, dll, exportall"
-Wseçeneği, derleyicinin derleme aşamasına geçirilir.langlvl(extended), JNI üstbilgi dosyaları tarafından kullanılan dil uzantılarını etkinleştirir; örneğin,long long.float(ieee), derleyiciye Java dilininfloatvedoubleilkel tipleriyle eşleşen ikili IEEE754 kayan nokta numaraları ve yönergeleri oluşturmasını bildirir.xplink, derleyiciye Java sanal makinesi tarafından kullanılan bağlantıyla eşleşen yüksek başarımlı XPLINK bağlantısını kullanmasını bildirir. 31 bitlik platformlarda, diğer bağlantılara (Sistem Bağlantısı gibi) geçiş, ek yol uzunluğu maliyeti ile Dil Ortamı ® tarafından desteklenir.dll, derleyiciye DLL kodu üretmesini bildirir. DLL kodu, işlevleri ve dış değişkenleri dışa ya da içe aktarabilir.exportall, paylaşılan kitaplıktaki çağrı işlevlerinin dış programlar tarafından çağrılabildiğini belirtir.
- -I/javahome/include
- Derleyiciye varsayılan dizinlere ek olarak üstbilgi dosyaları (bu durumda JNI üstbilgi dosyaları) için javahome/include dizinine bakmasını bildirir. javahome değerini, IBM SDK kuruluşunuzun JAVA_HOME yolu olacak şekilde değiştirin.
- Sample.c
- C programınız.
- /javahome/lib/s390x/j9vm/libjvm.x
- Yerel kodun Başlatma ve JNI API ' lerini bağlamasını ve çözmesini sağlayan yan deste dosyası.
-
Sampleuygulamasını çalıştırın.Hedef paylaşılan kitaplığı belirtmek içinSystem.loadLibraryJava API 'sini kullandığınızdan,LIBPATHortam değişkeninin ya dajava.library.pathözelliğininlibSample.sokitaplığının bulunduğu dizini içerdiğinden emin olmanız gerekir. Örneğin:
veyaLIBPATH=. java Samplejava -Djava.library.path=. SampleProgram aşağıdaki iletiyi verir:Printing from native
Sonuçlar
Artık Java uygulamalarından yerel paylaşılan kitaplıklara erişmek için aynı çerçeveyi kullanabilmeniz gerekir.