1 | #define dllexport _System |
---|
2 | #define dllimport _System |
---|
3 | |
---|
4 | #define INCL_DOSMISC |
---|
5 | #define INCL_DOSERRORS |
---|
6 | #include <os2.h> |
---|
7 | #include <stdio.h> |
---|
8 | #include <ctype.h> |
---|
9 | #include <jni.h> |
---|
10 | #include <libgen.h> |
---|
11 | |
---|
12 | char* stristr( const char* haystack, const char* needle ) { |
---|
13 | do { |
---|
14 | const char* h = haystack; |
---|
15 | const char* n = needle; |
---|
16 | while( toupper( (unsigned char) *h ) == toupper( (unsigned char) *n ) && *n ) { |
---|
17 | h++; |
---|
18 | n++; |
---|
19 | } |
---|
20 | if ( *n == 0 ) |
---|
21 | return (char *) haystack; |
---|
22 | } while( *haystack++ ); |
---|
23 | return 0; |
---|
24 | } |
---|
25 | |
---|
26 | JNIEnv* create_vm() { |
---|
27 | |
---|
28 | UCHAR uchLIBPATH[512] = ""; |
---|
29 | PSZ pszJAVAHome = ""; /* Environment variable to JAVA */ |
---|
30 | UCHAR SearchResult[256] = ""; /* Result of PATH search */ |
---|
31 | APIRET rc = NO_ERROR; /* Return code */ |
---|
32 | |
---|
33 | JavaVM* jvm; |
---|
34 | JNIEnv* env; |
---|
35 | JavaVMInitArgs args; |
---|
36 | JavaVMOption options[1]; |
---|
37 | |
---|
38 | int counter = 0; |
---|
39 | rc = DosQueryExtLIBPATH( uchLIBPATH, BEGIN_LIBPATH ); /* Query the BeginLIBPATH */ |
---|
40 | |
---|
41 | if( stristr( uchLIBPATH, "\\bin\\client" ) == NULL ) { |
---|
42 | rc = DosQueryExtLIBPATH( uchLIBPATH, END_LIBPATH ); /* Query the EndLIBPATH */ |
---|
43 | if( stristr( uchLIBPATH, "\\bin\\client" ) == NULL ) { |
---|
44 | for( ; counter < 2; counter++ ) { |
---|
45 | if( rc != NO_ERROR ) { |
---|
46 | rc = DosSearchPath( SEARCH_CUR_DIRECTORY | SEARCH_IGNORENETERRS, |
---|
47 | pszJAVAHome, /* Path value just obtained */ |
---|
48 | "JAVA.EXE", /* Name of file to look for */ |
---|
49 | SearchResult, /* Result of the search */ |
---|
50 | sizeof( SearchResult ) ); /* Length of search buffer */ |
---|
51 | } |
---|
52 | if( rc != NO_ERROR ) { |
---|
53 | if( counter < 1 ) |
---|
54 | rc = DosScanEnv( "JAVA_HOME", &pszJAVAHome ); /* Get contents of environment variable */ |
---|
55 | else |
---|
56 | rc = DosScanEnv( "PATH", &pszJAVAHome ); /* Get contents of PATH environment */ |
---|
57 | } else |
---|
58 | break; |
---|
59 | } |
---|
60 | rc = DosSetExtLIBPATH( dirname( SearchResult ), |
---|
61 | BEGIN_LIBPATH ); /* Add to beginning of LIBPATH */ |
---|
62 | } |
---|
63 | } |
---|
64 | if( rc == NO_ERROR ) { |
---|
65 | /* There is a new JNI_VERSION_1_4, but it doesn't add anything for the purposes of our example. */ |
---|
66 | args.version = JNI_VERSION_1_6; |
---|
67 | args.nOptions = 1; |
---|
68 | options[0].optionString = "-Djava.class.path=D:\\Programs\\vxrexx\\projects\\ODBCADMN\\j4o\\j4o.class"; |
---|
69 | args.options = options; |
---|
70 | args.ignoreUnrecognized = JNI_FALSE; |
---|
71 | |
---|
72 | JNI_CreateJavaVM( &jvm, (void**)env, &args ); |
---|
73 | } |
---|
74 | return env; |
---|
75 | } |
---|
76 | |
---|
77 | void invoke_class(JNIEnv* env) { |
---|
78 | jclass helloWorldClass; |
---|
79 | jmethodID mainMethod; |
---|
80 | jobjectArray applicationArgs; |
---|
81 | jstring applicationArg0; |
---|
82 | |
---|
83 | helloWorldClass = (*env)->FindClass(env, "HelloWorld"); |
---|
84 | |
---|
85 | mainMethod = (*env)->GetStaticMethodID(env, helloWorldClass, "main", "([Ljava/lang/String;)V"); |
---|
86 | |
---|
87 | applicationArgs = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env, "java/lang/String"), NULL); |
---|
88 | applicationArg0 = (*env)->NewStringUTF(env, "From-C-program"); |
---|
89 | (*env)->SetObjectArrayElement(env, applicationArgs, 0, applicationArg0); |
---|
90 | |
---|
91 | (*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, applicationArgs); |
---|
92 | } |
---|
93 | |
---|
94 | |
---|
95 | int main(int argc, char **argv) { |
---|
96 | JNIEnv* env = create_vm(); |
---|
97 | invoke_class( env ); |
---|
98 | return 0; |
---|
99 | } |
---|