We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

JNI Invocation interface - Callback from java to C++

Softverkpro
Softverkpro asked
on
Medium Priority
1,788 Views
Last Modified: 2013-12-14
Hi,
I am trying to use JNI invocation interface to start a java program from a c++ dll and then receive call back from the java program (it happens to be a socket server , so i need to know when someone is connecting to the socket server(java) )  . The problem is i can not find any documentation of call back in JNI invocation interface. I put my code here and can someone please tell me what I am doing wrong or point me in the right direction of some proper documentation on this matter (callback from java in JNI invocation interface.)

I have some clue about it though. I could pass a pointer to a function ( that is declared in my cpp ) to  the java program and then from the java program i could convert that pointer to a method and call it. But i do not know how to do it. So if anyone can provide me a sample code to do it , it will also be accepted as a solution.

Regards,
Shrouk Khan
// java code
public class Prog 
{
	public native void callcpp(); // trying to use this as a call back to cpp dll
	static{
		System.loadLibrary("CPPDll");
	}
    public static void main(String[] args) {
	
         System.out.println("Java program started, now going to do call back from java:  " + args[0]); //
       new Prog().callcpp(); // call a method in cpp
		 
    }
   
}
 
 
// dll code for starting the java program and receiving call back:
 
Callback  Connected=NULL;
int WINEXPORT start_java() //this is where i start the java program by calling its main metho
{
	
	printf("Inside \n");
	JNIEnv *env;
	JavaVM *jvm;
	jint res;
	jclass cls;
	jmethodID mid;
	jstring jstr;
	jclass stringClass;
	jobjectArray args;
 
	JavaVMInitArgs vm_args;
	JavaVMOption options[1];
	options[0].optionString =
		"-Djava.class.path=" USER_CLASSPATH;
	vm_args.version = 0x00010002;
	vm_args.options = options;
	vm_args.nOptions = 1;
	vm_args.ignoreUnrecognized = JNI_TRUE;
	/* Create the Java VM */
	res =JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
	printf("JVM Created \n");
	if (res < 0) {
		printf("cant create \n");
	}
 
	cls = env->FindClass("Prog");
	printf("class found  \n");
	if (cls == 0) {
		goto destroy;
	}
 
	mid = env->GetStaticMethodID(cls, "main",
		"([Ljava/lang/String;)V");
	if (mid == 0) {
		goto destroy;
	}
	jstr = env->NewStringUTF(" from C!");
	if (jstr == 0) {
		goto destroy;
	}
	stringClass = env->FindClass("java/lang/String");
	args = env->NewObjectArray( 1, stringClass, jstr);
	if (args == 0) {
		goto destroy;
	}
	env->CallStaticVoidMethod(cls, mid, args);
 
destroy:
	if (env->ExceptionOccurred()) 
	{
		env->ExceptionDescribe();
	}
	jvm->DestroyJavaVM();
	return 1;
}
 
Callback  Connected=NULL;
 
JNIEXPORT void JNICALL 
Java_Prog_callcpp(JNIEnv *env, jobject obj)
{
	Connected();
	printf("Call back received from java !\n");
	return;
}

Open in new window

Comment
Watch Question

Unlock this solution with a free trial preview.
(No credit card required)
Get Preview

Author

Commented:
actually it is possible (i think!) to just use some super expensive third party library's like the ones from TeamDev but then again I or anyone else would not learn anything and keep hitting into problems like this. So i decided to write the library on my own. :)
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a free trial preview!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.