Inline-Java

 view release on metacpan or  search on metacpan

Java/JNI.xs  view on Meta::CPAN

	char * CLASS
	char * classpath
	SV * args
	int	embedded
	int	debug
	int	native_doubles

	PREINIT:
	JavaVMInitArgs vm_args ;
	JavaVMOption *options ;
	JNIEnv *env ;
	JNINativeMethod nm ;
	jint res ;
	char *cp ;
	int args_len ;
	int i ;
	SV ** val = NULL ;
	STRLEN n_a ;

    CODE:
	args = SvRV(args) ;
	RETVAL = (InlineJavaJNIVM *)safemalloc(sizeof(InlineJavaJNIVM)) ;
	if (RETVAL == NULL){
		croak("Can't create InlineJavaJNIVM") ;
	}
	RETVAL->ijs = NULL ;
	RETVAL->debug = debug ;
	RETVAL->embedded = embedded ;
	RETVAL->native_doubles = native_doubles ;
	RETVAL->destroyed = 0 ;

	/* Figure out the length of the  args array */
	args_len = av_len((AV *)args) + 1 ;
	vm_args.version = JNI_VERSION_1_2 ;
	
	options = (JavaVMOption *)malloc((2 + args_len) * sizeof(JavaVMOption)) ;
	vm_args.options = options ;
	vm_args.nOptions = 0 ;
	vm_args.ignoreUnrecognized = JNI_FALSE ;

	options[vm_args.nOptions++].optionString = 
		((RETVAL->debug > 5) ? "-verbose" : "-verbose:") ;
	cp = (char *)malloc((strlen(classpath) + 32) * sizeof(char)) ;
	sprintf(cp, "-Djava.class.path=%s", classpath) ;
	options[vm_args.nOptions++].optionString = cp ;

	for (i = 0 ; i < args_len ; i++){
		val = av_fetch((AV *)args, i, 0) ;
		if (val != NULL){
			options[vm_args.nOptions++].optionString = SvPV(*val, n_a) ;
		}
	}

	/* Embedded patch and idea by Doug MacEachern */
	if (RETVAL->embedded) {
		/* We are already inside a JVM */
		jint n = 0 ;

		res = JNI_GetCreatedJavaVMs(&(RETVAL->jvm), 1, &n) ;
		if (n <= 0) {
			/* res == 0 even if no JVMs are alive */
			res = -1;
		}
		if (res < 0) {
			croak("Can't find any created Java JVMs") ;
		}

		env = get_env(RETVAL) ;
	}
	else {
		/* Create the Java VM */
		res = JNI_CreateJavaVM(&(RETVAL->jvm), (void **)&(env), &vm_args) ;
		if (res < 0) {
			croak("Can't create Java JVM using JNI") ;
		}
	}

	free(options) ;
	free(cp) ;


	/* Load the classes that we will use */
	RETVAL->ijs_class = (*(env))->FindClass(env, "org/perl/inline/java/InlineJavaServer") ;
	check_exception_from_perl(env, "Can't find class InlineJavaServer") ;
	RETVAL->ijs_class = (*(env))->NewGlobalRef(env, RETVAL->ijs_class) ;

	/* Get the method ids that are needed later */
	RETVAL->jni_main_mid = (*(env))->GetStaticMethodID(env, RETVAL->ijs_class, "jni_main",
		"(IZ)Lorg/perl/inline/java/InlineJavaServer;") ;
	check_exception_from_perl(env, "Can't find method jni_main in class InlineJavaServer") ;
	RETVAL->process_command_mid = (*(env))->GetMethodID(env, RETVAL->ijs_class, "ProcessCommand",
		"(Ljava/lang/String;)Ljava/lang/String;") ;
	check_exception_from_perl(env, "Can't find method ProcessCommand in class InlineJavaServer") ;

	/* Register the callback function */
	nm.name = "jni_callback" ;
	nm.signature = "(Ljava/lang/String;)Ljava/lang/String;" ;
	nm.fnPtr = jni_callback ;
	(*(env))->RegisterNatives(env, RETVAL->ijs_class, &nm, 1) ;
	check_exception_from_perl(env, "Can't register method jni_callback in class InlineJavaServer") ;

    OUTPUT:
	RETVAL



void
shutdown(this)
	InlineJavaJNIVM * this

	CODE:
	shutdown_JVM(this) ;



void
DESTROY(this)
	InlineJavaJNIVM * this

	CODE:
	shutdown_JVM(this) ;



( run in 2.829 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )