Ian Sharpe - Technical Notes - Java Native Interface and OS/2


Creating an EMX Java Development Environment

The IBM Java Development Kit by default is set up to support the IBM VisualAge C++ compiler. For EMX development it is necessary to:
  1. Amend the C header files
  2. Convert the libraries
  3. Update environment variables

Amend the C header files

Convert the libraries

Create javai.a and javai_g.a from the supplied .lib files.
emximp -o javai.a javai.lib
emximp -o javai_g.a javai_g.lib

Update environment variables

Examples

To invoke the Java interpreter:

Code:

#include <jni.h>

main() {
    JNIEnv *env;
    JavaVM *jvm;
    JDK1_1InitArgs vm_args;
    jint res;
    jclass cls;
    jmethodID mid;
    jstring jstr;
    jobjectArray args;


    /* IMPORTANT: specify vm_args version # if you use JDK1.1.2 and beyond */
    vm_args.version = 0x00010001;

    JNI_GetDefaultJavaVMInitArgs(&vm_args);

    res = JNI_CreateJavaVM(&jvm,&env,&vm_args);
    if (res < 0) {
        fprintf(stderr, "Can't create Java VM\n");
        exit(1);
    }

    cls = (*env)->FindClass(env, "Prog");
    if (cls == 0) {
        fprintf(stderr, "Can't find Prog class\n");
        exit(1);
    }
 
    mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
    if (mid == 0) {
        fprintf(stderr, "Can't find Prog.main\n");
        exit(1);
    }

    jstr = (*env)->NewStringUTF(env, " from C!");
    if (jstr == 0) {
        fprintf(stderr, "Out of memory\n");
        exit(1);
    }
    args = (*env)->NewObjectArray(env, 1, 
                        (*env)->FindClass(env, "java/lang/String"), jstr);
    if (args == 0) {
        fprintf(stderr, "Out of memory\n");
        exit(1);
    }
    (*env)->CallStaticVoidMethod(env, cls, mid, args);

    (*jvm)->DestroyJavaVM(jvm);
}


Build (IBM VisualAge C++):
icc invoke.c javai.lib


Original at http://www.zeit.demon.co.uk/isharpe/technote/jnios2.htm. $Id: jnios2.htm,v 1.1 2002/01/18 12:36:01 i_sharpe Exp $