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 | }
|
---|