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

  1. Ö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öntemi main yönteminden çağırır.

    Sample sı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ına lib öneki ve .so sonekini ekler ve SDK, LIBPATH ortam 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.
  2. Uygulamanın Java bölümü tamamlandı, artık derleyebilirsiniz:
    javac Sample.java
  3. Yerel kod için üstbilgi dosyası oluşturmak üzere javah komutunu kullanın:
    javah Sample
    Bu komut, yerli uygulama uygulamanız için uygun JNI yöntemi imzalarıyla Sample.hadlı bir C üstbilgi dosyası oluşturur.
  4. Sample.cadlı bir dosya oluşturun:
    #include <stdio.h>
    #include "Sample.h"
    
    JNIEXPORT void JNICALL Java_Sample_printFromNative(JNIEnv * env, jclass cls) {
      printf( "Printing from native\n" );
    }
    Bu dosya, Java Sample.printFromNative() yönteminin C yerel somutlamasını sağlar.
  5. Derle Sample.c, bağla ve bir Java uygulamasından dinamik olarak yüklenebilecek ve çağrılabilecek bir paylaşılan kitaplığa bağla libSample.so. Örneğin:
    31 bit uygulamalar için:
    xlc -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.x
    Burada javahome , IBM SDK kuruluşunuzun JAVA_HOME yoludur.
    64 bit uygulamalar için:
    xlc -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.x
    Burada javahome , 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 ( lib ile .soarasındaki metin), System.load(filename) ya da System.loadLibrary(filename) Java API ' larına sağladığınız adla eşleşmelidir.
    -W "l, xplink, dll"
    -W seç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"
    -W seç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 dilinin float ve double ilkel 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ı.
  6. Sample uygulamasını çalıştırın.
    Hedef paylaşılan kitaplığı belirtmek için System.loadLibrary Java API 'sini kullandığınızdan, LIBPATH ortam değişkeninin ya da java.library.path özelliğinin libSample.so kitaplığının bulunduğu dizini içerdiğinden emin olmanız gerekir. Örneğin:
    LIBPATH=. java Sample
    veya
    java -Djava.library.path=. Sample
    Program 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.