Using the code
The CTest.cpp file contains the code that calls different functions from Java classes. Java classes that are used in this project are given here under:
HelloWorld.java
ControlDetail.java
WorkOrder.java
ReturnData.java
HelloWorld.java contains the functions that will be called from CTest.cpp. The other three Java classes are simply used in place of structures in Java. As there is no structure concept in Java, we can use classes for that purpose. That is what the other three .java files contain.
HelloWorld.java contains the following functions that will be called from C/C++ code:
Hide Copy Code
public static void main(String args])
{
}
public static void TestCall(String szArg)
{
}
public static int DisplayStruct(ControlDetail ctrlDetail)
{
}
public static void DisplayStructArray(WorkOrder ArrWO])
{
}
public static Object ReturnObjFunc()
{
}
To call these functions from C/C++, first you need to load the JVM using the following function:
Hide Copy Code
JNIEnv* create_vm(JavaVM ** jvm) {
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options;
//Path to the java source code
options.optionString = "-Djava.class.path=D:\\Java Src\\TestStruct";
vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;
int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
if(ret < 0)
printf("
Unable to Launch JVM
");
return env;
}
Kindly note that to use this code, you will have to modify the options.optionString variable. You will have to set the path of the Java code: where the Java classes are placed. Currently, it being set to D:\Java Src\TestStruct. You can modify it to you situation. You will also need to modify the JDK version information in the above code, as shown below:
Hide Copy Code
vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
Modify it if you have another JDK version installed.
To call a specific Java function from C, you need to do the following:
Obtain the class reference using the FindClass(,,) method.
Obtain the method IDs of the functions of the class that you want to call using the GetStaticMethodID and GetMethodID function calls.
Call the functions using CallStaticVoidMethod, CallStaticIntMethod, and CallStaticObjectMethod.
One important thing to be noted here is specifying the function signatures while obtaining the method IDs.
To obtain the correct method signature, you can use the following Java command:
Hide Copy Code
javap -s -p HelloWorld
It will display you the signature of each function in the HelloWorld class. These signatures can be used to obtain the method IDs. The result of the above command can be seen below:
Hide Copy Code
D:\Java Src\TestStruct>javap -s -p HelloWorld
Compiled from “HelloWorld.java”
public class HelloWorld extends java.lang.Object{
public HelloWorld();
Signature: ()V
public static void main(java.lang.String]);
Signature: ([Ljava/lang/String;)V
public static void TestCall(java.lang.String);
Signature: (Ljava/lang/String;)V
public static int DisplayStruct(ControlNEDetail);
Signature: (LControlNEDetail;)I
public static void DisplayStructArray(WorkOrder[]);
Signature: (LWorkOrder;)V
public static java.lang.Object ReturnObjFunc();
Signature: ()Ljava/lang/Object;
}
Kindly note that while specifying the method name in the GetMethodID function, if the method is a constructor, then its method name will be <init>.
Prerequisites
Before traveling down a difficult path, it is important to understand the basic concepts and to have various frameworks and tools installed on your computer.
You will need the Sun Java Developer Kit (JDK). I recommend Java 1.6.0.
Any C/C++ compiler installed.
How to run
To use this code, follow the instructions below:
Compile the *.java files using the javac command.
Compile the CTest.cpp file using any C++ compiler; I used MSVC++ 6.