Click here to Skip to main content
15,891,905 members
Articles / Programming Languages / Java / Java SE

Example of using Object-Oriented Java Native Interface in C++

Rate me:
Please Sign up or sign in to vote.
3.73/5 (10 votes)
3 Feb 2006CPOL4 min read 78.5K   1.8K   39  
Demonstrates an easy way of creating and embedding Java objects into C++ code, with Object-Oriented JNI.
/******************************************************************
 *  All rights reserved � 2005 Vitaly Shelest (Javain Ltd)
 *
 *  File name:              JNIHelper.h
 *
 *  Last modification:      02.04.2005
 *
 *  Description:            CJNIEnv class
 *
 *  Authors:                Vitaly Shelest
 *
 *****************************************************************/

#pragma once

#include <jni.h>
//#pragma comment(lib, "jvm.lib")


class CJNIEnv {
    
private:
    JNIEnv* env;
    JavaVM *jvm;
    JavaVMInitArgs vm_args;
    JavaVMOption* options;
    _bstr_t newcp;
    _bstr_t bstrClassPath;
    _bstr_t bstrClPath;
    
public:
    CJNIEnv(JNIEnv* _env):env(0),jvm(0),bstrClassPath(""){
        env = _env;
        if(env)
            jvm = GetJavaVM();
    }

    CJNIEnv(JavaVM *_jvm):jvm(_jvm),bstrClassPath("") {
        AttachCurrentThread();
    }

    CJNIEnv(_bstr_t bstrPath = "", unsigned long ver = JNI_VERSION_1_2):env(0),jvm(0),bstrClassPath(""),bstrClPath(""){
        memset(&vm_args, 0, sizeof(vm_args));
        vm_args.version = ver;
        JNI_GetDefaultJavaVMInitArgs(&vm_args);
        if(bstrPath.length())
        {
            bstrClPath = bstrPath;
            options = new JavaVMOption[1];
            memset(options, 0, sizeof(JavaVMOption));
       		char* cp = getenv( "CLASSPATH" );
            bstrClPath = _bstr_t("-Djava.class.path=");
            bstrClPath += cp;
            bstrClPath += ";";
            bstrClPath += bstrPath + ";";
            options[0].optionString = bstrClPath;
            options[0].extraInfo = NULL;
            vm_args.nOptions = 1;
            vm_args.options = options;
        }
    }
    
    virtual ~CJNIEnv(){
        DetachCurrentThread();
        if(jvm)
            jvm -> DestroyJavaVM();
    }
    
    
    jint CreateJavaVM(){
        jint ret = JNI_CreateJavaVM(&jvm, (LPVOID*)&env, &vm_args);
        return ret;
    }
    
    jint GetCreatedJavaVMs(JavaVM** vmBuf, jsize bufLen, jsize* nVMs){
        return JNI_GetCreatedJavaVMs(vmBuf, bufLen, nVMs); 
    }

    
    jint GetJavaVM(){
        if(env)
            return env -> GetJavaVM(&jvm); 
        else
            return -1;
    }
  
    
    jint GetVersion(){
        if(env)
            return env -> GetVersion(); 
        else
            return -1;
    }
    
    jint AttachCurrentThread(void* thr_args = 0){
        if(jvm)
            return jvm -> AttachCurrentThread((void**)&env, thr_args);
        else
            return -1;
    }
    
    jint DetachCurrentThread(){
        if(jvm)
            return jvm -> DetachCurrentThread();
        else
            return -1;
    }
  
    
    _bstr_t GetStringChars(jstring string){
        _bstr_t res;
        jboolean isCopy;
        jchar* chars = (jchar*)env -> GetStringChars(string, &isCopy);
        jsize size = env -> GetStringLength(string);
        chars[size] = ((LPWSTR)_bstr_t("\0"))[0];
        res = chars;
        if(isCopy == JNI_TRUE)
            env -> ReleaseStringChars(string, chars);
        return res;
    }


    jstring SetStringChars(_bstr_t string){
        jstring res;
        return res;
    }

    operator JNIEnv*(){
        return env;
    }
    
    operator JavaVM*(){
        return jvm;
    }
};

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) Javain Ltd
Israel Israel
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions