Re: C++ wrapper for java
Jack wrote:
How to write C++ wrapper for java code? Where can I find a sample
code?
It should be in any good JNI ressource.
Some code attached below.
Arne
================================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <jni.h>
void start_java(int maxmem, char *classpath, char *mainclass,int
nargs,char **args)
{
JavaVMOption options[2];
JavaVMInitArgs vm_args;
JNIEnv *env;
JavaVM *jvm;
jint res;
jclass mainclassptr;
jmethodID mainmethod;
jobjectArray mainargs;
jstring *mainargsptr;
int i;
char maxmemopt[16];
char classpathopt[1024];
char mainclass2[128];
sprintf(maxmemopt,"-Xmx%dm",maxmem);
sprintf(classpathopt,"-Djava.class.path=%s",classpath);
options[0].optionString = maxmemopt;
options[1].optionString = classpathopt;
vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 2;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_FALSE;
res = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args);
if(res<0)
{
printf("Error creating JVM\n");
return;
}
strcpy(mainclass2,mainclass);
for(i=0;i<strlen(mainclass2);i++)
{
if(mainclass2[i]=='.')
{
mainclass2[i]='/';
}
}
mainclassptr = (*env)->FindClass(env,mainclass2);
if(mainclassptr==NULL)
{
printf("Error finding class %s\n",mainclass);
return;
}
mainmethod = (*env)->GetStaticMethodID(env,mainclassptr,"main",
"([Ljava/lang/String;)V");
if (mainmethod==NULL)
{
printf("Error getting main method in class %s\n",mainclass);
return;
}
mainargs =
(*env)->NewObjectArray(env,nargs,(*env)->FindClass(env,"java/lang/String"),NULL);
mainargsptr = (jstring *)malloc(nargs*sizeof(jstring));
for(i=0;i<nargs;i++)
{
mainargsptr[i] = (*env)->NewStringUTF(env,args[i]);
(*env)->SetObjectArrayElement(env,mainargs,i,mainargsptr[i]);
}
(*env)->CallStaticVoidMethod(env,mainclassptr,mainmethod,mainargs);
free(mainargsptr);
(*jvm)->DestroyJavaVM(jvm);
return;
}
int main(int argc,char *argv[])
{
/*
* java -Xmx128m -classpath test.jar test.Test A BB CCC
*/
char *args[] = { "A", "BB", "CCC" };
start_java(128, "test.jar", "test.Test", 3, args);
return 0;
}