1 | //#define dllexport _System |
---|
2 | //#define dllimport _System |
---|
3 | |
---|
4 | #define INCL_DOS |
---|
5 | #define INCL_DOSMODULEMGR |
---|
6 | #define INCL_DOSMISC |
---|
7 | #define INCL_DOSERRORS |
---|
8 | #include <os2.h> |
---|
9 | #include <stdio.h> |
---|
10 | #include <ctype.h> |
---|
11 | #include <jni.h> |
---|
12 | #include <stdlib.h> |
---|
13 | #include <iostream> |
---|
14 | #include "var.hpp" |
---|
15 | |
---|
16 | |
---|
17 | //Ensure to add "APIRET rc = NO_ERROR;" to every function that call INITPROC as it set rc |
---|
18 | #ifdef __WATCOMC__ |
---|
19 | #define INITPROC( h, r, f, p ) r( __syscall *f)p; rc = DosQueryProcAddr( h, NULL, #f, (PFN *) &f ); if( rc != NO_ERROR ) cerr << "Unable to load " << #f; |
---|
20 | #else |
---|
21 | #define INITPROC( h, r, f, p ) r(*f)p; rc = DosQueryProcAddr( h, NULL, ( PCSZ )#f, (PFN *) &f ); if( rc != NO_ERROR ) cerr << "Unable to load " << #f; |
---|
22 | #endif |
---|
23 | HMODULE hmod; |
---|
24 | |
---|
25 | APIRET loadLibrary() { |
---|
26 | |
---|
27 | var static_variable; |
---|
28 | var szFailName( _MAX_PATH, Grow ); |
---|
29 | var LIBPATH( 1024, Grow ); |
---|
30 | var SearchPath( _MAX_PATH, Grow ); |
---|
31 | var JAVAHome( _MAX_PATH, Grow ); /* Environment variable to JAVA */ |
---|
32 | APIRET rc = NO_ERROR; /* Return code */ |
---|
33 | int i = 0; |
---|
34 | |
---|
35 | int counter = 0; |
---|
36 | rc = DosQueryExtLIBPATH( LIBPATH, BEGIN_LIBPATH ); /* Query the BeginLIBPATH */ |
---|
37 | |
---|
38 | if( !LIBPATH.contains( "\\bin\\client" ) ) { |
---|
39 | rc = DosQueryExtLIBPATH( LIBPATH, END_LIBPATH ); /* Query the EndLIBPATH */ |
---|
40 | if( !LIBPATH.contains( "\\bin\\client" ) ) { |
---|
41 | for( ; counter < 3; counter++ ) { |
---|
42 | rc = DosSearchPath( SEARCH_CUR_DIRECTORY | SEARCH_IGNORENETERRS, |
---|
43 | LIBPATH, /* Path value just obtained */ |
---|
44 | static_variable.cpy( "JAVA.EXE" ), /* Name of file to look for */ |
---|
45 | JAVAHome, /* Result of the search */ |
---|
46 | _MAX_PATH ); /* Length of search buffer */ |
---|
47 | |
---|
48 | cout << "LibPath: " << LIBPATH << " rc: " << rc << " JAVAHome: " << JAVAHome << endl; |
---|
49 | |
---|
50 | if( rc != NO_ERROR ) { |
---|
51 | if( counter < 1 ) { |
---|
52 | rc = DosScanEnv( static_variable.cpy( "JAVA_HOME" ), LIBPATH ); /* Get contents of environment variable */ |
---|
53 | } else { |
---|
54 | rc = DosScanEnv( static_variable.cpy( "PATH" ), LIBPATH ); /* Get contents of PATH environment */ |
---|
55 | } |
---|
56 | } else { |
---|
57 | break; |
---|
58 | } |
---|
59 | } |
---|
60 | } |
---|
61 | cout << "JAVAHome: " << JAVAHome << endl; |
---|
62 | JAVAHome.reSize().before( '\\', true ).reSize(); /* To last \ */ |
---|
63 | cout << "JAVAHome: " << JAVAHome << endl; |
---|
64 | JAVAHome.cpy( "D:\\PROGRAMS\\OPENJDK\\BIN" ); |
---|
65 | cout << "JAVAHome: " << JAVAHome << endl; |
---|
66 | LIBPATH.reSize( 0 ).flush().cat( JAVAHome, ';', JAVAHome, "\\client;%PATH%" ); |
---|
67 | rc = DosSetExtLIBPATH( LIBPATH, |
---|
68 | BEGIN_LIBPATH ); /* Add to beginning of LIBPATH */ |
---|
69 | } |
---|
70 | |
---|
71 | rc = DosLoadModule( szFailName, /* Failed module name */ |
---|
72 | sizeof( szFailName ), /* Size of buffer */ |
---|
73 | static_variable.cpy( "jvm.dll" ), /* Name of DLL */ |
---|
74 | &hmod ); /* Module handle here */ |
---|
75 | if( rc != NO_ERROR ) { |
---|
76 | DosFreeModule( hmod ); /* Frees the DLL module */ |
---|
77 | return ERROR_FILE_NOT_FOUND; |
---|
78 | } |
---|
79 | return NO_ERROR; |
---|
80 | } |
---|
81 | |
---|
82 | JNIEnv* create_vm() { |
---|
83 | APIRET rc = loadLibrary(); |
---|
84 | if( rc == NO_ERROR ) { |
---|
85 | JavaVM* jvm; |
---|
86 | JNIEnv* env; |
---|
87 | JavaVMInitArgs args; |
---|
88 | //memset(&args, 0, sizeof(args)); |
---|
89 | //memset(options, 0, sizeof(options)); |
---|
90 | JavaVMOption options[] = { |
---|
91 | { "-Xmx512m", NULL }, |
---|
92 | { "-XX:+TraceClassLoading", NULL },//To see the origin of the problem class |
---|
93 | { "-Djava.class.path=.", NULL }, //D:\\Programs\\vxrexx\\projects\\ODBCADMN\\j4o"; |
---|
94 | { "-Djava.library.path=.", NULL },// set native library path |
---|
95 | { "-Djava.compiler=NONE", NULL }, // disable JIT |
---|
96 | { "-verbose:gc", NULL }, // print gc messages |
---|
97 | { "-verbose:jni", NULL }, // print JNI-related messages |
---|
98 | { "-verbose:class", NULL } // print class loading messages |
---|
99 | }; |
---|
100 | |
---|
101 | args.version = JNI_VERSION_1_6; |
---|
102 | args.nOptions = sizeof( options ) / sizeof( JavaVMOption ); |
---|
103 | args.options = options; |
---|
104 | args.ignoreUnrecognized = JNI_FALSE; |
---|
105 | |
---|
106 | INITPROC( hmod, jint, JNI_CreateJavaVM, ( JavaVM **p_vm, void **p_env, void *vm_args ) ); |
---|
107 | jint jrc = JNI_CreateJavaVM( &jvm, (void**)&env, &args ); |
---|
108 | //#ifdef __WATCOMC__ |
---|
109 | if( jrc != JNI_OK ) |
---|
110 | cerr << "Problems loading JVM" << endl; |
---|
111 | else |
---|
112 | cout << "JVM has been loaded sucessfully" << endl; |
---|
113 | //#endif |
---|
114 | //delete options; |
---|
115 | return env; |
---|
116 | } |
---|
117 | return NULL; |
---|
118 | } |
---|
119 | |
---|
120 | void invoke_class( JNIEnv* env ) { |
---|
121 | jclass helloWorldClass; |
---|
122 | jmethodID mainMethod; |
---|
123 | jobjectArray applicationArgs; |
---|
124 | jstring applicationArg0; |
---|
125 | |
---|
126 | helloWorldClass = env->FindClass( "HelloWorld" ); |
---|
127 | |
---|
128 | mainMethod = env->GetStaticMethodID( helloWorldClass, "main", "([Ljava/lang/String;)V" ); |
---|
129 | |
---|
130 | applicationArgs = env->NewObjectArray( 1, env->FindClass( "java/lang/String" ), NULL ); |
---|
131 | applicationArg0 = env->NewStringUTF( "From-C-program" ); |
---|
132 | env->SetObjectArrayElement( applicationArgs, 0, applicationArg0 ); |
---|
133 | |
---|
134 | env->CallStaticVoidMethod( helloWorldClass, mainMethod, applicationArgs); |
---|
135 | } |
---|
136 | |
---|
137 | int main( int argc, char **argv ) { |
---|
138 | JNIEnv* env = create_vm(); |
---|
139 | if( env ) |
---|
140 | invoke_class( env ); |
---|
141 | else |
---|
142 | return 1; |
---|
143 | return 0; |
---|
144 | } |
---|