📄 jni.xs
字号:
PUSHs(sv_2mortal(newSViv(*r++))); } } else { if (RETVAL_len_) { PUSHs(sv_2mortal(newSVpvn((char*)RETVAL, (STRLEN)RETVAL_len_ * sizeof(jbyte)))); } else PUSHs(&PL_sv_no); } (*env)->ReleaseByteArrayElements(env, array,RETVAL,JNI_ABORT); RESTOREENV; }jchar *GetCharArrayElements(array) JNIEnv * env = FETCHENV; jsize RETVAL_len_ = NO_INIT; jcharArray array jboolean isCopy = NO_INIT; PPCODE: { RETVAL = (*env)->GetCharArrayElements(env, array,&isCopy); RETVAL_len_ = (*env)->GetArrayLength(env, array); if (GIMME == G_ARRAY) { int i; jchar* r = RETVAL; EXTEND(sp, RETVAL_len_); for (i = RETVAL_len_; i; --i) { PUSHs(sv_2mortal(newSViv(*r++))); } } else { if (RETVAL_len_) { PUSHs(sv_2mortal(newSVpvn((char*)RETVAL, (STRLEN)RETVAL_len_ * sizeof(jchar)))); } else PUSHs(&PL_sv_no); } (*env)->ReleaseCharArrayElements(env, array,RETVAL,JNI_ABORT); RESTOREENV; }jshort *GetShortArrayElements(array) JNIEnv * env = FETCHENV; jsize RETVAL_len_ = NO_INIT; jshortArray array jboolean isCopy = NO_INIT; PPCODE: { RETVAL = (*env)->GetShortArrayElements(env, array,&isCopy); RETVAL_len_ = (*env)->GetArrayLength(env, array); if (GIMME == G_ARRAY) { int i; jshort* r = RETVAL; EXTEND(sp, RETVAL_len_); for (i = RETVAL_len_; i; --i) { PUSHs(sv_2mortal(newSViv(*r++))); } } else { if (RETVAL_len_) { PUSHs(sv_2mortal(newSVpvn((char*)RETVAL, (STRLEN)RETVAL_len_ * sizeof(jshort)))); } else PUSHs(&PL_sv_no); } (*env)->ReleaseShortArrayElements(env, array,RETVAL,JNI_ABORT); RESTOREENV; }jint *GetIntArrayElements(array) JNIEnv * env = FETCHENV; jsize RETVAL_len_ = NO_INIT; jintArray array jboolean isCopy = NO_INIT; PPCODE: { RETVAL = (*env)->GetIntArrayElements(env, array,&isCopy); RETVAL_len_ = (*env)->GetArrayLength(env, array); if (GIMME == G_ARRAY) { int i; jint* r = RETVAL; EXTEND(sp, RETVAL_len_); for (i = RETVAL_len_; i; --i) { PUSHs(sv_2mortal(newSViv(*r++))); } } else { if (RETVAL_len_) { PUSHs(sv_2mortal(newSVpvn((char*)RETVAL, (STRLEN)RETVAL_len_ * sizeof(jint)))); } else PUSHs(&PL_sv_no); } (*env)->ReleaseIntArrayElements(env, array,RETVAL,JNI_ABORT); RESTOREENV; }jlong *GetLongArrayElements(array) JNIEnv * env = FETCHENV; jsize RETVAL_len_ = NO_INIT; jlongArray array jboolean isCopy = NO_INIT; PPCODE: { RETVAL = (*env)->GetLongArrayElements(env, array,&isCopy); RETVAL_len_ = (*env)->GetArrayLength(env, array); if (GIMME == G_ARRAY) { int i; jlong* r = RETVAL; EXTEND(sp, RETVAL_len_); for (i = RETVAL_len_; i; --i) { PUSHs(sv_2mortal(newSViv(*r++))); } } else { if (RETVAL_len_) { PUSHs(sv_2mortal(newSVpvn((char*)RETVAL, (STRLEN)RETVAL_len_ * sizeof(jlong)))); } else PUSHs(&PL_sv_no); } (*env)->ReleaseLongArrayElements(env, array,RETVAL,JNI_ABORT); RESTOREENV; }jfloat *GetFloatArrayElements(array) JNIEnv * env = FETCHENV; jsize RETVAL_len_ = NO_INIT; jfloatArray array jboolean isCopy = NO_INIT; PPCODE: { RETVAL = (*env)->GetFloatArrayElements(env, array,&isCopy); RETVAL_len_ = (*env)->GetArrayLength(env, array); if (GIMME == G_ARRAY) { int i; jfloat* r = RETVAL; EXTEND(sp, RETVAL_len_); for (i = RETVAL_len_; i; --i) { PUSHs(sv_2mortal(newSVnv(*r++))); } } else { if (RETVAL_len_) { PUSHs(sv_2mortal(newSVpvn((char*)RETVAL, (STRLEN)RETVAL_len_ * sizeof(jfloat)))); } else PUSHs(&PL_sv_no); } (*env)->ReleaseFloatArrayElements(env, array,RETVAL,JNI_ABORT); RESTOREENV; }jdouble *GetDoubleArrayElements(array) JNIEnv * env = FETCHENV; jsize RETVAL_len_ = NO_INIT; jdoubleArray array jboolean isCopy = NO_INIT; PPCODE: { RETVAL = (*env)->GetDoubleArrayElements(env, array,&isCopy); RETVAL_len_ = (*env)->GetArrayLength(env, array); if (GIMME == G_ARRAY) { int i; jdouble* r = RETVAL; EXTEND(sp, RETVAL_len_); for (i = RETVAL_len_; i; --i) { PUSHs(sv_2mortal(newSVnv(*r++))); } } else { if (RETVAL_len_) { PUSHs(sv_2mortal(newSVpvn((char*)RETVAL, (STRLEN)RETVAL_len_ * sizeof(jdouble)))); } else PUSHs(&PL_sv_no); } (*env)->ReleaseDoubleArrayElements(env, array,RETVAL,JNI_ABORT); RESTOREENV; }voidGetBooleanArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; jbooleanArray array jsize start jsize len STRLEN tmplen = len * sizeof(jboolean) + 1; char * tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen); jboolean * buf = (jboolean*)sv_grow(ST(3),len * sizeof(jboolean)+1); CODE: { (*env)->GetBooleanArrayRegion(env, array,start,len,buf); SvCUR_set(ST(3), len * sizeof(jboolean)); *SvEND(ST(3)) = '\0'; RESTOREENV; }voidGetByteArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; jbyteArray array jsize start jsize len STRLEN tmplen = len * sizeof(jboolean) + 1; char * tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen); jbyte * buf = (jbyte*)sv_grow(ST(3),len * sizeof(jbyte)+1); CODE: { (*env)->GetByteArrayRegion(env, array,start,len,buf); SvCUR_set(ST(3), len * sizeof(jbyte)); *SvEND(ST(3)) = '\0'; RESTOREENV; }voidGetCharArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; jcharArray array jsize start jsize len STRLEN tmplen = len * sizeof(jboolean) + 1; char * tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen); jchar * buf = (jchar*)sv_grow(ST(3),len * sizeof(jchar)+1); CODE: { (*env)->GetCharArrayRegion(env, array,start,len,buf); SvCUR_set(ST(3), len * sizeof(jchar)); *SvEND(ST(3)) = '\0'; RESTOREENV; }voidGetShortArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; jshortArray array jsize start jsize len STRLEN tmplen = len * sizeof(jboolean) + 1; char * tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen); jshort * buf = (jshort*)sv_grow(ST(3),len * sizeof(jshort)+1); CODE: { (*env)->GetShortArrayRegion(env, array,start,len,buf); SvCUR_set(ST(3), len * sizeof(jshort)); *SvEND(ST(3)) = '\0'; RESTOREENV; }voidGetIntArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; jintArray array jsize start jsize len STRLEN tmplen = len * sizeof(jboolean) + 1; char * tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen); jint * buf = (jint*)sv_grow(ST(3),len * sizeof(jint)+1); CODE: { (*env)->GetIntArrayRegion(env, array,start,len,buf); SvCUR_set(ST(3), len * sizeof(jint)); *SvEND(ST(3)) = '\0'; RESTOREENV; }voidGetLongArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; jlongArray array jsize start jsize len STRLEN tmplen = len * sizeof(jboolean) + 1; char * tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen); jlong * buf = (jlong*)sv_grow(ST(3),len * sizeof(jlong)+1); CODE: { (*env)->GetLongArrayRegion(env, array,start,len,buf); SvCUR_set(ST(3), len * sizeof(jlong)); *SvEND(ST(3)) = '\0'; RESTOREENV; }voidGetFloatArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; jfloatArray array jsize start jsize len STRLEN tmplen = len * sizeof(jboolean) + 1; char * tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen); jfloat * buf = (jfloat*)sv_grow(ST(3),len * sizeof(jfloat)+1); CODE: { (*env)->GetFloatArrayRegion(env, array,start,len,buf); SvCUR_set(ST(3), len * sizeof(jfloat)); *SvEND(ST(3)) = '\0'; RESTOREENV; }voidGetDoubleArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; jdoubleArray array jsize start jsize len STRLEN tmplen = len * sizeof(jboolean) + 1; char * tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen); jdouble * buf = (jdouble*)sv_grow(ST(3),len * sizeof(jdouble)+1); CODE: { (*env)->GetDoubleArrayRegion(env, array,start,len,buf); SvCUR_set(ST(3), len * sizeof(jdouble)); *SvEND(ST(3)) = '\0'; RESTOREENV; }voidSetBooleanArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; STRLEN tmplen = NO_INIT; jbooleanArray array jsize start jsize len jsize buf_len_ = NO_INIT; jboolean * buf CODE: { if (buf_len_ < len) croak("string is too short"); else if (buf_len_ > len && PL_dowarn) warn("string is too long"); (*env)->SetBooleanArrayRegion(env, array,start,len,buf); RESTOREENV; }voidSetByteArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; STRLEN tmplen = NO_INIT; jbyteArray array jsize start jsize len jsize buf_len_ = NO_INIT; jbyte * buf CODE: { if (buf_len_ < len) croak("string is too short"); else if (buf_len_ > len && PL_dowarn) warn("string is too long"); (*env)->SetByteArrayRegion(env, array,start,len,buf); RESTOREENV; }voidSetCharArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; STRLEN tmplen = NO_INIT; jcharArray array jsize start jsize len jsize buf_len_ = NO_INIT; jchar * buf CODE: { if (buf_len_ < len) croak("string is too short"); else if (buf_len_ > len && PL_dowarn) warn("string is too long"); (*env)->SetCharArrayRegion(env, array,start,len,buf); RESTOREENV; }voidSetShortArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; STRLEN tmplen = NO_INIT; jshortArray array jsize start jsize len jsize buf_len_ = NO_INIT; jshort * buf CODE: { if (buf_len_ < len) croak("string is too short"); else if (buf_len_ > len && PL_dowarn) warn("string is too long"); (*env)->SetShortArrayRegion(env, array,start,len,buf); RESTOREENV; }voidSetIntArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; STRLEN tmplen = NO_INIT; jintArray array jsize start jsize len jsize buf_len_ = NO_INIT; jint * buf CODE: { if (buf_len_ < len) croak("string is too short"); else if (buf_len_ > len && PL_dowarn) warn("string is too long"); (*env)->SetIntArrayRegion(env, array,start,len,buf); RESTOREENV; }voidSetLongArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; STRLEN tmplen = NO_INIT; jlongArray array jsize start jsize len jsize buf_len_ = NO_INIT; jlong * buf CODE: { if (buf_len_ < len) croak("string is too short"); else if (buf_len_ > len && PL_dowarn) warn("string is too long"); (*env)->SetLongArrayRegion(env, array,start,len,buf); RESTOREENV; }voidSetFloatArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; STRLEN tmplen = NO_INIT; jfloatArray array jsize start jsize len jsize buf_len_ = NO_INIT; jfloat * buf CODE: { if (buf_len_ < len) croak("string is too short"); else if (buf_len_ > len && PL_dowarn) warn("string is too long"); (*env)->SetFloatArrayRegion(env, array,start,len,buf); RESTOREENV; }voidSetDoubleArrayRegion(array,start,len,buf) JNIEnv * env = FETCHENV; STRLEN tmplen = NO_INIT; jdoubleArray array jsize start jsize len jsize buf_len_ = NO_INIT; jdouble * buf CODE: { if (buf_len_ < len) croak("string is too short"); else if (buf_len_ > len && PL_dowarn) warn("string is too long"); (*env)->SetDoubleArrayRegion(env, array,start,len,buf); RESTOREENV; }SysRetRegisterNatives(clazz,methods,nMethods) JNIEnv * env = FETCHENV; jclass clazz JNINativeMethod * methods jint nMethods CODE: { RETVAL = (*env)->RegisterNatives(env, clazz,methods,nMethods); }SysRetUnregisterNatives(clazz) JNIEnv * env = FETCHENV; jclass clazz CODE: { RETVAL = (*env)->UnregisterNatives(env, clazz); } OUTPUT: RETVAL SysRetMonitorEnter(obj) JNIEnv * env = FETCHENV; jobject obj CODE: { RETVAL = (*env)->MonitorEnter(env, obj); RESTOREENV; } OUTPUT: RETVALSysRetMonitorExit(obj) JNIEnv * env = FETCHENV; jobject obj CODE: { RETVAL = (*env)->MonitorExit(env, obj); RESTOREENV; } OUTPUT: RETVALJavaVM *GetJavaVM(...) JNIEnv * env = FETCHENV; CODE: {#ifdef JPL_DEBUG jpldebug = 1;#else jpldebug = 0;#endif if (env) { /* We're embedded. */ if ((*env)->GetJavaVM(env, &RETVAL) < 0) RETVAL = 0; } else { /* We're embedding. */#ifdef KAFFE JavaVMInitArgs vm_args;#else JDK1_1InitArgs vm_args;#endif char *lib; if (jpldebug) { fprintf(stderr, "We're embedding Java in Perl.\n"); } if (items--) { ++mark; lib = SvPV(*mark, PL_na); } else lib = 0; if (jpldebug) { fprintf(stderr, "lib is %s.\n", lib); }#ifdef WIN32 if (LoadLibrary("jvm.dll")) { if (!LoadLibrary("javai.dll")) { warn("Can't load javai.dll"); } } else { if (lib && !LoadLibrary(lib)) croak("Can't load javai.dll"); }#else if (jpldebug) { fprintf(stderr, "Opening Java shared library.\n"); }#ifdef KAFFE if (!dlopen("libkaffevm.so", RTLD_LAZY|RTLD_GLOBAL)) {#else if (!dlopen("libjava.so", RTLD_LAZY|RTLD_GLOBAL)) {#endif if (lib && !dlopen(lib, RTLD_LAZY|RTLD_GLOBAL)) croak("Can't load Java shared library."); }#endif /* Kaffe seems to get very upset if vm_args.version isn't set */#ifdef KAFFE vm_args.version = JNI_VERSION_1_1;#endif JNI_GetDefaultJavaVMInitArgs(&vm_args); vm_args.exit = &call_my_exit; if (jpldebug) { fprintf(stderr, "items = %d\n", items); fprintf(stderr, "mark = %s\n", SvPV(*mark, PL_na)); } while (items > 1) { char *s; ++mark; s = SvPV(*mark,PL_na); ++mark; if (jpldebug) { fprintf(stderr, "*s = %s\n", s); fprintf(stderr, "val = %s\n", SvPV(*mark, PL_na)); } items -= 2; if (strEQ(s, "checkSource")) vm_args.checkSource = (jint)SvIV(*mark); else if (strEQ(s, "nativeStackSize")) vm_args.nativeStackSize = (jint)SvIV(*mark); else if (strEQ(s, "javaStackSize")) vm_args.javaStackSize = (jint)SvIV(*mark); else if (strEQ(s, "minHeapSize")) vm_args.minHeapSize = (jint)SvIV(*mark); else if (strEQ(s, "maxHeapSize")) vm_args.maxHeapSize = (jint)SvIV(*mark); else if (strEQ(s, "verifyMode")) vm_args.verifyMode = (jint)SvIV(*mark); else if (strEQ(s, "classpath")) vm_args.classpath = savepv(SvPV(*mark,PL_na)); else if (strEQ(s, "enableClassGC")) vm_args.enableClassGC = (jint)SvIV(*mark); else if (strEQ(s, "enableVerboseGC")) vm_args.enableVerboseGC = (jint)SvIV(*mark); else if (strEQ(s, "disableAsyncGC")) vm_args.disableAsyncGC = (jint)SvIV(*mark);#ifdef KAFFE else if (strEQ(s, "libraryhome")) vm_args.libraryhome = savepv(SvPV(*mark,PL_na)); else if (strEQ(s, "classhome")) vm_args.classhome = savepv(SvPV(*mark,PL_na)); else if (strEQ(s, "enableVerboseJIT")) vm_args.enableVerboseJIT = (jint)SvIV(*mark); else if (strEQ(s, "enableVerboseClassloading")) vm_args.enableVerboseClassloading = (jint)SvIV(*mark); else if (strEQ(s, "enableVerboseCall")) vm_args.enableVerboseCall = (jint)SvIV(*mark); else if (strEQ(s, "allocHeapSize")) vm_args.allocHeapSize = (jint)SvIV(*mark); #else else if (strEQ(s, "verbose")) vm_args.verbose = (jint)SvIV(*mark); else if (strEQ(s, "debugging")) vm_args.debugging = (jboolean)SvIV(*mark); else if (strEQ(s, "debugPo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -