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 )