Take the 2-minute tour ×

Just a simple question: Is it possible to call a java function from c/c++ ?

share|improve this question
Did you do a little googling. The answer is, yes you can. You can do it using Java Native Interface programming. You can detailed documentation in the answers below. I am surprised everybody is posting full programs instead of passing pointers. I hope this is not the first time somebody asked this question. –  Suresh Koya Nov 21 '12 at 5:33

7 Answers 7

up vote 16 down vote accepted

Yes you can, but it is a little convoluted, and works in a reflective/non type safe way (example uses the C++ api which is a little cleaner than the C version). In this case it creates an instance of the Java VM from within the C code. If your native called is first being called from Java then there is no need to construct a VM instance


int main(int argc, char** argv) {

    JavaVM *vm;
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_2;
    vm_args.nOptions = 0;
    vm_args.ignoreUnrecognized = 1;

    // Construct a VM
    jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);

    // Construct a String
    jstring jstr = env->NewStringUTF("Hello World");

    // First get the class that contains the method you need to call
    jclass clazz = env->FindClass("java/lang/String");

    // Get the method that you want to call
    jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase",
    // Call the method on the object
    jobject result = env->CallObjectMethod(jstr, to_lower);

    // Get a C-style string
    const char* str = env->GetStringUTFChars((jstring) result, NULL);

    printf("%s\n", str);

    // Clean up
    env->ReleaseStringUTFChars(jstr, str);

    // Shutdown the VM.

To compile (on Ubuntu):

    -I/usr/lib/jvm/java-6-sun/include/linux \ 
    -L/usr/lib/jvm/java-6-sun/jre/lib/i386/server/ -ljvm jnitest.cc

Note: that the return code from each of these methods should be checked in order to implement correct error handling (I've ignored this for convenience). E.g.

str = env->GetStringUTFChars(jstr, NULL);
if (str == NULL) {
    return; /* out of memory */
share|improve this answer
+1 for example. Might also want to include links/examples of setting up the headers, function signatures, etc? –  poundifdef Jun 14 '09 at 16:25

After coding above examples, you need to do some configuration on your project.

Steps to link the jvm.lib to your project in Visual Studio:

  • Right click on the project -> properties.
  • On the Properties dialog box, add jvm.lib under Linker->Input->AdditionalDependencies area.
  • Lastly write jvm.lib path(like "C:\Program Files\Java\jdk1.7.0_60\lib") under Linker->General->AdditionalLibraryDirectories

After those steps, your project can link to jvm and work well.

share|improve this answer

The following function allows you to create the VM.

JNIEnv* create_vm(JavaVM ** jvm)
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options[2];

    options[1].optionString = "-DXcheck:jni:pedantic";  

    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 2;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = JNI_TRUE; // remove unrecognized options

    return env;

Compile the famous Hello World program. The following function attempts to call the main method of the HelloWorld Program.

int main(int argc, char* argv[])
    JNIEnv* env;
    JavaVM* jvm;

    env = create_vm(&jvm);

    if (env == NULL) return 1;

    jclass myClass = NULL;
    jmethodID main = NULL;

    myClass = env->FindClass("HelloWorld");

    if (myClass != NULL)

    if (main != NULL)

    }else printf("main method not found") ;

    return 0;

Now put create_vm function and main function into a single cpp file, include jni.h and compile it. I used MinGW on windows.


Exection Now if you run the created exe, you will get an error. jvm.dll not found . Put C:\Program Files\Java\jre6\bin\client in your PATH environment variable. Now you can run the exe file.

Note: Don't displace the jvm.dll file.

share|improve this answer

Take a look at the invocation API. This enables you to load and start up a JVM from within your native application, and then to invoke methods upon it from the application.

Briefly (from the linked doc)

/* load and initialize a Java VM, return a JNI interface  
 * pointer in env */ 
JNI_CreateJavaVM(&jvm, &env, &vm_args); 

/* invoke the Main.test method using the JNI */ 
jclass cls = env->FindClass("Main"); 
jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V"); 
env->CallStaticVoidMethod(cls, mid, 100);
share|improve this answer

Yes, you can call a Java function from C++ or C, but unless you're using something like COM or CORBA (or another 3rd-party tool that I'm probably not aware of) you'll have to do this in the context of JNI.

The whole procedure to call a Java method from native code is described in Chapter 4 in section 4.2 called "Calling Methods" in Sun's JNI guide pdf, which you can find here.

share|improve this answer

There are many ways. Here are some ideas. In addition, commercial Java-COM bridges allow COM communication from c++ to java (if you are using Windows). You should also look at CNI.

share|improve this answer

Yes it is, but you have to do it via JNI: http://java.sun.com/javase/6/docs/technotes/guides/jni/index.html

share|improve this answer
I've seen JNI used to call C++ from Java. Didn't know it worked the other way as well. –  Kieveli Jun 14 '09 at 13:35
Strange, I've always seen it more commonly used to provide access to C++ libraries from Java, but it works both ways. –  Charles Bailey Jun 14 '09 at 13:38

Your Answer


