Jun 19, 2002

          onlsun1, SPARCstation 20 システムでのJNIの実行
                         ---  hello world実行#1
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                  (http://www-online.kek.jp/~inoue/para-CAMAC/
                                   Test/Hello-JNI.html)



                        高エネルギー加速器研究機構
                            素粒子原子核研究所
                         物理、オンライングループ
                                井上 栄二

 (1).   現状確認

        (A). onlsun1にjava version "1.4.0-b92" がインストールされている。


 (2).   ここでやるべきこと
	
	onlsun1のマシン上でJNIでのhello world を実行する。


 (3).   コンパイル

   (3-1).  Javaのチェック

onlsun1[212]% java -version
java version "1.4.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92)
Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)
onlsun1[213]% 



   (3-2).  実行環境

onlsun1[213]% env
HOME=/export/home/onlsun1/inoue
PATH=/opt/NSCPnav/bin:/home5/ORBacus4.1.1/JOB-4.1.1/bin:/usr/java/bin:/usr/java/jre/bin:/usr/horb13b4a/horb/bin:/usr/horb202:/usr/java/bin:/usr/java/jre/bin:/usr/java1.4.0/j2sdk1.4.0/bin:/usr/java1.4.0/j2sdk1.4.0/jre/bin:/export/home/onlsun1/inoue/HORB/horb21b2/bin:/home2/opt/gimp/bin:/export/home/onlsun1/inoue/FastEther/X1059A/TTCP/ttcp:/opt/Acrobat4/bin:/opt/sfw/bin:/usr/local/bin:/home3/opt_ext/LBLxfig/bin:/net/fs/public/solaris_licensed/forte6/sparc/SUNWspro/bin:/kek/compilers/ws5.0/SUNWspro/bin:/kek/compilers/volume5/SUNWspro/bin:/kek/compilers/volume4/SUNWspro/bin:/kek/SUNWspro/bin:/usr/sbin:/usr/ccs/bin:/export/home/onlsun1/inoue/bin:/home3/NSUG93/X11R5/bin:/usr/dt/bin:/bin:/usr/bin:/usr/ucb:/etc:.:/usr/openwin/bin:/kek/local/bin:/kek/cern/97a/bin:/home1/cern/95a/bin
LOGNAME=inoue
HZ=100
TERM=dtterm
TZ=Japan
SHELL=/bin/csh
MAIL=/var/mail/inoue
LANG=ja
PWD=/export/home/onlsun1/inoue/JNI
USER=inoue
LD_LIBRARY_PATH=/home5/ORBacus4.1.1/JOB-4.1.1/lib:/usr/horb13b4a/horb/lib:/usr/java/lib:/usr/java/jre/lib:/usr/horb202:/export/home/onlsun1/inoue/HORB/horb202:/usr/java1.4.0/j2sdk1.4.0/jre/lib/sparc:/usr/java1.4.0/j2sdk1.4.0/jre/lib:/usr/java1.4.0/j2sdk1.4.0/lib:/export/home/onlsun1/inoue/HORB/horb21b2:/net/fs/public/solaris_licensed/forte6/sparc/SUNWspro/lib:/kek/compilers/ws5.0/SUNWspro/lib:/kek/compilers/volume5/SUNWspro/lib:/kek/compilers/volume4/SUNWspro/lib:/kek/SUNWspro/lib:/opt/sfw/lib:/home3/NSUG93/X11R5/lib
LD_RUN_PATH=/usr/horb13b4a/horb/lib:/usr/JOB-4.1.1/lib:/usr/java/jre/lib:/usr/horb202:/export/home/onlsun1/inoue/HORB/horb202:/usr/java1.4.0/j2sdk1.4.0/jre/lib/sparc:/usr/java1.4.0/j2sdk1.4.0/jre/lib:/usr/java1.4.0/j2sdk1.4.0/lib:/export/home/onlsun1/inoue/HORB/horb21b2:/net/fs/public/solaris_licensed/forte6/sparc/SUNWspro/lib:/kek/compilers/ws5.0/SUNWspro/lib:/opt/gtk/lib:/home2/opt/gimp/lib:/opt/sfw/lib:/home3/NSUG93/X11R5/lib:/usr/X11R6.1/lib:/usr/local/lib
MANPATH=/net/fs/public/solaris_licensed/forte6/sparc/SUNWspro/man:/kek/compilers/ws5.0/SUNWspro/man/:/kek/compilers/volume5/SUNWspro/man:/usr/openwin/man:/usr/man:/usr/dt/man:/usr/local/man:/kek/compilers/volume4/SUNWspro/man:/kek/SUNWspro/man:/opt/sfw/man
NNTPSERVER=keknews
ORBACUS_LICENSE=/home5/ORBacus4.1.1/JOB-4.1.1/licenses_job.txt
LESS=-c -h0
DISPLAY=onlsun2:0
CLASSPATH=.
onlsun1[214]% 


   (3-3).  Javaコードを書く

	この実行で使用するソースコードは、以下のURLから入手した。
	http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jni/index.html

nlsun1[234]% cat HelloWorld.java
class HelloWorld {
    public native void displayHelloWorld();

    static {
        System.loadLibrary("hello");
    }
    
    public static void main(String[] args) {
        new HelloWorld().displayHelloWorld();
    }
}
onlsun1[235]% 


   (3-4).  Javaコードをコンパイルする

onlsun1[237]% ls -l
合計 4
-rw-r--r--   1 inoue    kek          224  6月 19日  10:51 HelloWorld.java
drwxr-xr-x   2 inoue    kek          512  6月 19日  10:46 example1/
onlsun1[238]% javac HelloWorld.java
onlsun1[239]% ls -l
合計 6
-rw-r--r--   1 inoue    kek          462  6月 19日  10:59 HelloWorld.class
-rw-r--r--   1 inoue    kek          224  6月 19日  10:51 HelloWorld.java
drwxr-xr-x   2 inoue    kek          512  6月 19日  10:46 example1/
onlsun1[240]% 


   (3-5).  .hファイルの生成

	C++言語のヘッダーファイルは、以下のようにjavahというコマンドで生成
	できる。 オプションには-jniを指定し、引数には項目(3-4)でコンパイルした
	クラスの拡張子を除いたものを指定する。

onlsun1[240]% javah -jni HelloWorld
onlsun1[241]% ls -l
合計 8
-rw-r--r--   1 inoue    kek          462  6月 19日  10:59 HelloWorld.class
-rw-r--r--   1 inoue    kek          401  6月 19日  11:08 HelloWorld.h
-rw-r--r--   1 inoue    kek          224  6月 19日  10:51 HelloWorld.java
drwxr-xr-x   2 inoue    kek          512  6月 19日  10:46 example1/
onlsun1[242]% cat HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
onlsun1[243]% 


   (3-6).  C言語のソースファイルの作成

onlsun1[252]% cat HelloWorldImp.c
#include 
#include "HelloWorld.h"
#include 

JNIEXPORT void JNICALL 
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 
{
    printf("Hello world!\n");
    return;
}
onlsun1[253]% 


   (3-7).  C言語のソースファイルをコンパイルしてシェアード・ライブラリを作成

onlsun1[173]% pwd
/export/home/onlsun1/inoue/JNI
onlsun1[174]% ls -l
合計 10
-rw-r--r--   1 inoue    kek          462  6月 19日  10:59 HelloWorld.class
-rw-r--r--   1 inoue    kek          401  6月 19日  11:08 HelloWorld.h
-rw-r--r--   1 inoue    kek          224  6月 19日  10:51 HelloWorld.java
-rw-r--r--   1 inoue    kek          192  6月 19日  11:31 HelloWorldImp.c
drwxr-xr-x   2 inoue    kek          512  6月 19日  10:46 example1/
onlsun1[175]% cc -G -I/usr/java/include -I/usr/java/include/solaris HelloWorldImp.c -o libhello.so
onlsun1[176]% ls -l
合計 22
-rw-r--r--   1 inoue    kek          462  6月 19日  10:59 HelloWorld.class
-rw-r--r--   1 inoue    kek          401  6月 19日  11:08 HelloWorld.h
-rw-r--r--   1 inoue    kek          224  6月 19日  10:51 HelloWorld.java
-rw-r--r--   1 inoue    kek          192  6月 19日  11:31 HelloWorldImp.c
drwxr-xr-x   2 inoue    kek          512  6月 19日  10:46 example1/
-rwxr-xr-x   1 inoue    kek         5412  6月 19日  13:24 libhello.so*
onlsun1[177]% 


   (3-8).  プログラムの実行

onlsun1[188]% pwd
/export/home/onlsun1/inoue/JNI
onlsun1[189]% ls -l
合計 22
-rw-r--r--   1 inoue    kek          462  6月 19日  10:59 HelloWorld.class
-rw-r--r--   1 inoue    kek          401  6月 19日  11:08 HelloWorld.h
-rw-r--r--   1 inoue    kek          224  6月 19日  10:51 HelloWorld.java
-rw-r--r--   1 inoue    kek          192  6月 19日  11:31 HelloWorldImp.c
drwxr-xr-x   2 inoue    kek          512  6月 19日  10:46 example1/
-rwxr-xr-x   1 inoue    kek         5412  6月 19日  13:24 libhello.so*
onlsun1[190]% java HelloWorld
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1410)
        at java.lang.Runtime.loadLibrary0(Runtime.java:772)
        at java.lang.System.loadLibrary(System.java:832)
        at HelloWorld.(HelloWorld.java:5)
onlsun1[191]% 

	ライブラリpathが正しくセットされていない。 

onlsun1[191]% env
MANPATH=/net/fs/public/solaris_licensed/forte6/sparc/SUNWspro/man:/kek/compilers/ws5.0/SUNWspro/man/:/kek/compilers/volume5/SUNWspro/man:/usr/openwin/man:/usr/man:/usr/dt/man:/usr/local/man:/kek/compilers/volume4/SUNWspro/man:/kek/SUNWspro/man:/opt/sfw/man
DTDATABASESEARCHPATH=/export/home/onlsun1/inoue/.dt/types,/etc/dt/appconfig/types/%L,/usr/dt/appconfig/types/%L,/usr/dt/appconfig/types/C
DTXSERVERLOCATION=local
LANG=ja
HELPPATH=/usr/openwin/lib/locale:/usr/openwin/lib/help
DTSOURCEPROFILE=true
PATH=/opt/NSCPnav/bin:/home5/ORBacus4.1.1/Java/bin:/usr/java/bin:/usr/java/jre/bin:/usr/horb13b4a/horb/bin:/usr/horb202:/usr/java/bin:/usr/java/jre/bin:/usr/java1.4.0/j2sdk1.4.0/bin:/usr/java1.4.0/j2sdk1.4.0/jre/bin:/export/home/onlsun1/inoue/HORB/horb21b2/bin:/home2/opt/gimp/bin:/export/home/onlsun1/inoue/FastEther/X1059A/TTCP/ttcp:/opt/Acrobat4/bin:/opt/sfw/bin:/usr/local/bin:/home3/opt_ext/LBLxfig/bin:/net/fs/public/solaris_licensed/forte6/sparc/SUNWspro/bin:/kek/compilers/ws5.0/SUNWspro/bin:/kek/compilers/volume5/SUNWspro/bin:/kek/compilers/volume4/SUNWspro/bin:/kek/SUNWspro/bin:/usr/sbin:/usr/ccs/bin:/export/home/onlsun1/inoue/bin:/home3/NSUG93/X11R5/bin:/usr/dt/bin:/bin:/usr/bin:/usr/ucb:/etc:.:/usr/openwin/bin:/kek/local/bin:/kek/cern/97a/bin:/home1/cern/95a/bin
AB_CARDCATALOG=/usr/dt/share/answerbooks/ja/ab_cardcatalog
DTUSERSESSION=inoue-onlsun1-0
XMICONBMSEARCHPATH=/export/home/onlsun1/inoue/.dt/icons/%B%M.bm:/export/home/onlsun1/inoue/.dt/icons/%B%M.pm:/export/home/onlsun1/inoue/.dt/icons/%B:/usr/dt/appconfig/icons/%L/%B%M.bm:/usr/dt/appconfig/icons/%L/%B%M.pm:/usr/dt/appconfig/icons/%L/%B:/usr/dt/appconfig/icons/C/%B%M.bm:/usr/dt/appconfig/icons/C/%B%M.pm:/usr/dt/appconfig/icons/C/%B
SESSION_SVR=onlsun1
OPENWINHOME=/usr/openwin
EDITOR=/usr/dt/bin/dtpad
LOGNAME=inoue
DTSCREENSAVERLIST=StartDtscreenSwarm StartDtscreenQix     StartDtscreenFlame StartDtscreenHop StartDtscreenImage StartDtscreenLife     StartDtscreenRotor StartDtscreenPyro StartDtscreenWorm StartDtscreenBlank
MAIL=/var/mail/inoue
USER=inoue
DISPLAY=:0.0
SHELL=/bin/csh
DTAPPSEARCHPATH=/export/home/onlsun1/inoue/.dt/appmanager:/etc/dt/appconfig/appmanager/%L:/etc/dt/appconfig/appmanager/C:/usr/dt/appconfig/appmanager/%L:/usr/dt/appconfig/appmanager/C
HOME=/export/home/onlsun1/inoue
XFILESEARCHPATH=/usr/openwin/lib/locale/%L/%T/%N%S:/usr/openwin/lib/%T/%N%S
XMICONSEARCHPATH=/export/home/onlsun1/inoue/.dt/icons/%B%M.pm:/export/home/onlsun1/inoue/.dt/icons/%B%M.bm:/export/home/onlsun1/inoue/.dt/icons/%B:/usr/dt/appconfig/icons/%L/%B%M.pm:/usr/dt/appconfig/icons/%L/%B%M.bm:/usr/dt/appconfig/icons/%L/%B:/usr/dt/appconfig/icons/C/%B%M.pm:/usr/dt/appconfig/icons/C/%B%M.bm:/usr/dt/appconfig/icons/C/%B
TERM=dtterm
dtstart_sessionlogfile=/dev/null
TZ=Japan
DTHELPSEARCHPATH=/export/home/onlsun1/inoue/.dt/help/inoue-onlsun1-0/%H:/export/home/onlsun1/inoue/.dt/help/inoue-onlsun1-0/%H.sdl:/export/home/onlsun1/inoue/.dt/help/inoue-onlsun1-0/%H.hv:/export/home/onlsun1/inoue/.dt/help/%H:/export/home/onlsun1/inoue/.dt/help/%H.sdl:/export/home/onlsun1/inoue/.dt/help/%H.hv:/usr/dt/appconfig/help/%L/%H:/usr/dt/appconfig/help/%L/%H.sdl:/usr/dt/appconfig/help/%L/%H.hv:/usr/dt/appconfig/help/C/%H:/usr/dt/appconfig/help/C/%H.sdl:/usr/dt/appconfig/help/C/%H.hv
XMBINDDIR=/usr/dt/lib/bindings
LD_LIBRARY_PATH=/home5/ORBacus4.1.1/Java/lib:/usr/horb13b4a/horb/lib:/usr/java/lib:/usr/java/jre/lib:/usr/horb202:/export/home/onlsun1/inoue/HORB/horb202:/usr/java1.4.0/j2sdk1.4.0/jre/lib/sparc:/usr/java1.4.0/j2sdk1.4.0/jre/lib:/usr/java1.4.0/j2sdk1.4.0/lib:/export/home/onlsun1/inoue/HORB/horb21b2:/net/fs/public/solaris_licensed/forte6/sparc/SUNWspro/lib:/kek/compilers/ws5.0/SUNWspro/lib:/kek/compilers/volume5/SUNWspro/lib:/kek/compilers/volume4/SUNWspro/lib:/kek/SUNWspro/lib:/opt/sfw/lib:/home3/NSUG93/X11R5/lib
LD_RUN_PATH=/usr/horb13b4a/horb/lib:/usr/java/lib:/usr/java/jre/lib:/usr/horb202:/export/home/onlsun1/inoue/HORB/horb202:/usr/java1.4.0/j2sdk1.4.0/jre/lib/sparc:/usr/java1.4.0/j2sdk1.4.0/jre/lib:/usr/java1.4.0/j2sdk1.4.0/lib:/export/home/onlsun1/inoue/HORB/horb21b2:/net/fs/public/solaris_licensed/forte6/sparc/SUNWspro/lib:/kek/compilers/ws5.0/SUNWspro/lib:/opt/gtk/lib:/home2/opt/gimp/lib:/opt/sfw/lib:/home3/NSUG93/X11R5/lib:/usr/X11R6.1/lib:/usr/local/lib
NNTPSERVER=keknews
ORBACUS_LICENSE=/home5/ORBacus4.1.1/Java/licenses_job.txt
LESS=-c -h0
WINDOWID=37748749
TERMINAL_EMULATOR=dtterm
PWD=/export/home/onlsun1/inoue/JNI
onlsun1[192]% 

onlsun1[192]% setenv LD_LIBRARY_PATH .:$LD_LIBRARY_PATH
onlsun1[193]%

onlsun1[193]% env
		:
LD_LIBRARY_PATH=.:/home5/ORBacus4.1.1/JOB-4.1.1/lib:/usr/horb13b4a/horb/lib:/usr/java/lib:/usr/java/jre/lib:/usr/horb202:/export/home/onlsun1/inoue/HORB/horb202:/usr/java1.4.0/j2sdk1.4.0/jre/lib/sparc:/usr/java1.4.0/j2sdk1.4.0/jre/lib:/usr/java1.4.0/j2sdk1.4.0/lib:/export/home/onlsun1/inoue/HORB/horb21b2:/net/fs/public/solaris_licensed/forte6/sparc/SUNWspro/lib:/kek/compilers/ws5.0/SUNWspro/lib:/kek/compilers/volume5/SUNWspro/lib:/kek/compilers/volume4/SUNWspro/lib:/kek/SUNWspro/lib:/opt/sfw/lib:/home3/NSUG93/X11R5/lib
		:
onlsun1[194]%

onlsun1[194]% java HelloWorld
Hello world!
onlsun1[195]% 

	ok.  JNIによる Hello World は正常に実行できた。

---xxxx