I use PureBasic in combination with Java. This week I update from Java 1.8 to Java 10. My code works with Java 1.6, 1.7 and 1.8 as expected but with the upgrade to Java 10 I can't create a JVM instance anymore. All I get is the error 4294967290. I search via Google and find a few entries about bad options. So I tried other options but without success. My approach to use the JVM bases on the JNI implementation from Froggerprogger from here. I extended his approach and updated it to the actual JVM 10 specification. At first my JNI include and then a simple test program to understand the error. Hope that somebody can help me and give me a tip.
Thanks for your support.
Cheers
Stefan
Code: Select all
; Begin - JNI.pbi-------------------------------------------------------
; Macros - Pseudo type definitions------------------------------------
; Unsigned 8 bits (1 Byte, True or False)---------------------------
Macro JBoolean
a
EndMacro
; Signed 8 bits (1 Byte, -128 to 127)-------------------------------
Macro JByte
b
EndMacro
; Unsigned 16 bits (2 Byte, Character)------------------------------
Macro JChar
u
EndMacro
; Signed 16 bits (2 Byte, -32768 to 32767)--------------------------
Macro JShort
w
EndMacro
; Signed 32 bits (4 Byte, -2147483648 to 2147483647)----------------
Macro JInt
l
EndMacro
; Signed 64 bits (8 Byte)-------------------------------------------
Macro JLong
q
EndMacro
; 32 bits (4 Byte)--------------------------------------------------
Macro JFloat
f
EndMacro
; 64 bits (8 Byte)--------------------------------------------------
Macro JDouble
d
EndMacro
;-Constants-----------------------------------------------------------
Enumeration
#JNI_COMMIT = 1
#JNI_ABORT
EndEnumeration
Enumeration
#JNI_OK
#JNI_ERR = -1
#JNI_EDETACHED = -2
#JNI_EVERSION = -3
#JNI_ENOMEM = -4
#JNI_EEXIST = -5
#JNI_EINVAL = -6
EndEnumeration
Enumeration
#JNI_FALSE
#JNI_TRUE
EndEnumeration
Enumeration
#JNIInvalidRefType
#JNILocalRefType
#JNIGlobalRefType
#JNIWeakGlobalRefType
EndEnumeration
Enumeration
#JNI_VERSION_1_1 = $00010001
#JNI_VERSION_1_2 = $00010002
#JNI_VERSION_1_4 = $00010004
#JNI_VERSION_1_6 = $00010006
#JNI_VERSION_1_8 = $00010008
#JNI_VERSION_9 = $00090000
#JNI_VERSION_10 = $000A0000
EndEnumeration
;-Structures----------------------------------------------------------
Structure JavaVMOption
*optionString
*extraInfo
EndStructure
Structure JavaVMInitArgs
version.JInt
nOption.JInt
*options.JavaVMOption
ignoreUnrecognized.JBoolean
EndStructure
Structure JObject
EndStructure
Structure JFieldID
EndStructure
Structure JMethodID
EndStructure
Structure JValue
StructureUnion
zJVal.JBoolean
bJVal.JByte
cJVal.JChar
sJVal.JShort
iJVal.JInt
jJVal.JLong
fJVal.JFloat
dJVal.JDouble
lJVal.JObject
EndStructureUnion
EndStructure
; Macros - Pseudo type definitions------------------------------------
Macro JClass
JObject
EndMacro
Macro JThrowable
JObject
EndMacro
Macro JString
JObject
EndMacro
Macro JArray
JObject
EndMacro
Macro JBooleanArray
JObject
EndMacro
Macro JByteArray
JObject
EndMacro
Macro JCharArray
JObject
EndMacro
Macro JShortArray
JObject
EndMacro
Macro JIntArray
JObject
EndMacro
Macro JLongArray
JObject
EndMacro
Macro JFloatArray
JObject
EndMacro
Macro JDoubleArray
JObject
EndMacro
Macro JObjectArray
JObject
EndMacro
Macro JWeak
JObject
EndMacro
Macro JRef
JObject
EndMacro
;-Interfaces----------------------------------------------------------
Interface JNIInvokeInterface
reserved0()
reserved1()
reserved2()
DestroyJavaVM()
AttachCurrentThread(penv, args)
DetachCurrentThread()
GetEnv(penv, version)
AttachCurrentThreadAsDaemon(penv, args)
EndInterface
Interface JNINativeInterface
reserved0()
reserved1()
reserved2()
reserved3()
GetVersion()
DefineClass(name, loader, buf, len)
FindClass(name)
FromReflectedMethod(method)
FromReflectedField(field)
ToReflectedMethod(clazz, methodID, isStatic)
GetSuperclass(clazz)
IsAssignableFrom(clazz1, clazz2)
ToReflectedField(clazz, fieldID, isStatic)
Throw(obj)
ThrowNew(clazz, msg)
ExceptionOccurred()
ExceptionDescribe()
ExceptionClear()
FatalError(msg)
PushLocalFrame(capacity)
PopLocalFrame(result)
NewGlobalRef(lobj)
DeleteGlobalRef(gref)
DeleteLocalRef(obj)
IsSameObject(obj1, obj2)
NewLocalRef(ref)
EnsureLocalCapacity(capacity)
AllocObject(clazz)
NewObject(clazz, methodID)
NewObjectV(clazz, methodID, args)
NewObjectA(clazz, methodID, args)
GetObjectClass(obj)
IsInstanceOf(obj, clazz)
GetMethodID(clazz, name, sig)
CallObjectMethod(obj, methodID)
CallObjectMethodV(obj, methodID, args)
CallObjectMethodA(obj, methodID, args)
CallBooleanMethod(obj, methodID)
CallBooleanMethodV(obj, methodID, args)
CallBooleanMethodA(obj, methodID, args)
CallByteMethod(obj, methodID)
CallByteMethodV(obj, methodID, args)
CallByteMethodA(obj, methodID, args)
CallCharMethod(obj, methodID)
CallCharMethodV(obj, methodID, args)
CallCharMethodA(obj, methodID, args)
CallShortMethod(obj, methodID)
CallShortMethodV(obj, methodID, args)
CallShortMethodA(obj, methodID, args)
CallIntMethod(obj, methodID)
CallIntMethodV(obj, methodID, args)
CallIntMethodA(obj, methodID, args)
CallLongMethod(obj, methodID)
CallLongMethodV(obj, methodID, args)
CallLongMethodA(obj, methodID, args)
CallFloatMethod(obj, methodID)
CallFloatMethodV(obj, methodID, args)
CallFloatMethodA(obj, methodID, args)
CallDoubleMethod(obj, methodID)
CallDoubleMethodV(obj, methodID, args)
CallDoubleMethodA(obj, methodID, args)
CallVoidMethod(obj, methodID)
CallVoidMethodV(obj, methodID, args)
CallVoidMethodA(obj, methodID, args)
CallNonvirtualObjectMethod(obj, clazz, methodID)
CallNonvirtualObjectMethodV(obj, clazz, methodID, args)
CallNonvirtualObjectMethodA(obj, clazz, methodID, args)
CallNonvirtualBooleanMethod(obj, clazz, methodID)
CallNonvirtualBooleanMethodV(obj, clazz, methodID, args)
CallNonvirtualBooleanMethodA(obj, clazz, methodID, args)
CallNonvirtualByteMethod(obj, clazz, methodID)
CallNonvirtualByteMethodV(obj, clazz, methodID, args)
CallNonvirtualByteMethodA(obj, clazz, methodID, args)
CallNonvirtualCharMethod(obj, clazz, methodID)
CallNonvirtualCharMethodV(obj, clazz, methodID, args)
CallNonvirtualCharMethodA(obj, clazz, methodID, args)
CallNonvirtualShortMethod(obj, clazz, methodID)
CallNonvirtualShortMethodV(obj, clazz, methodID, args)
CallNonvirtualShortMethodA(obj, clazz, methodID, args)
CallNonvirtualIntMethod(obj, clazz, methodID)
CallNonvirtualIntMethodV(obj, clazz, methodID, args)
CallNonvirtualIntMethodA(obj, clazz, methodID, args)
CallNonvirtualLongMethod(obj, clazz, methodID)
CallNonvirtualLongMethodV(obj, clazz, methodID, args)
CallNonvirtualLongMethodA(obj, clazz, methodID, args)
CallNonvirtualFloatMethod(obj, clazz, methodID)
CallNonvirtualFloatMethodV(obj, clazz, methodID, args)
CallNonvirtualFloatMethodA(obj, clazz, methodID, args)
CallNonvirtualDoubleMethod(obj, clazz, methodID)
CallNonvirtualDoubleMethodV(obj, clazz, methodID, args)
CallNonvirtualDoubleMethodA(obj, clazz, methodID, args)
CallNonvirtualVoidMethod(obj, clazz, methodID)
CallNonvirtualVoidMethodV(obj, clazz, methodID, args)
CallNonvirtualVoidMethodA(obj, clazz, methodID, args)
GetFieldID(clazz, name, sig)
GetObjectField(obj, fieldID)
GetBooleanField(obj, fieldID)
GetByteField(obj, fieldID)
GetCharField(obj, fieldID)
GetShortField(obj, fieldID)
GetIntField(obj, fieldID)
GetLongField(obj, fieldID)
GetFloatField(obj, fieldID)
GetDoubleField(obj, fieldID)
SetObjectField(obj, fieldID, val)
SetBooleanField(obj, fieldID, val)
SetByteField(obj, fieldID, val)
SetCharField(obj, fieldID, val)
SetShortField(obj, fieldID, val)
SetIntField(obj, fieldID, val)
SetLongField(obj, fieldID, val)
SetFloatField(obj, fieldID, val)
SetDoubleField(obj, fieldID, val)
GetStaticMethodID(clazz, name, sig)
CallStaticObjectMethod(clazz, methodID)
CallStaticObjectMethodV(clazz, methodID, args)
CallStaticObjectMethodA(clazz, methodID, args)
CallStaticBooleanMethod(clazz, methodID)
CallStaticBooleanMethodV(clazz, methodID, args)
CallStaticBooleanMethodA(clazz, methodID, args)
CallStaticByteMethod(clazz, methodID)
CallStaticByteMethodV(clazz, methodID, args)
CallStaticByteMethodA(clazz, methodID, args)
CallStaticCharMethod(clazz, methodID)
CallStaticCharMethodV(clazz, methodID, args)
CallStaticCharMethodA(clazz, methodID, args)
CallStaticShortMethod(clazz, methodID)
CallStaticShortMethodV(clazz, methodID, args)
CallStaticShortMethodA(clazz, methodID, args)
CallStaticIntMethod(clazz, methodID)
CallStaticIntMethodV(clazz, methodID, args)
CallStaticIntMethodA(clazz, methodID, args)
CallStaticLongMethod(clazz, methodID)
CallStaticLongMethodV(clazz, methodID, args)
CallStaticLongMethodA(clazz, methodID, args)
CallStaticFloatMethod(clazz, methodID)
CallStaticFloatMethodV(clazz, methodID, args)
CallStaticFloatMethodA(clazz, methodID, args)
CallStaticDoubleMethod(clazz, methodID)
CallStaticDoubleMethodV(clazz, methodID, args)
CallStaticDoubleMethodA(clazz, methodID, args)
CallStaticVoidMethod(clazz, methodID)
CallStaticVoidMethodV(clazz, methodID, args)
CallStaticVoidMethodA(clazz, methodID, args)
GetStaticFieldID(clazz, name, sig)
GetStaticObjectField(clazz, fieldID)
GetStaticBooleanField(clazz, fieldID)
GetStaticByteField(clazz, fieldID)
GetStaticCharField(clazz, fieldID)
GetStaticShortField(clazz, fieldID)
GetStaticIntField(clazz, fieldID)
GetStaticLongField(clazz, fieldID)
GetStaticFloatField(clazz, fieldID)
GetStaticDoubleField(clazz, fieldID)
SetStaticObjectField(clazz, fieldID, value)
SetStaticBooleanField(clazz, fieldID, value)
SetStaticByteField(clazz, fieldID, value)
SetStaticCharField(clazz, fieldID, value)
SetStaticShortField(clazz, fieldID, value)
SetStaticIntField(clazz, fieldID, value)
SetStaticLongField(clazz, fieldID, value)
SetStaticFloatField(clazz, fieldID, value)
SetStaticDoubleField(clazz, fieldID, value)
NewString(unicode, len)
GetStringLength(string)
GetStringChars(string, isCopy)
ReleaseStringChars(string, chars)
NewStringUTF(utf)
GetStringUTFLength(string)
GetStringUTFChars(string, isCopy)
ReleaseStringUTFChars(string, chars)
GetArrayLength(arr)
NewObjectArray(len, clazz, init)
GetObjectArrayElement(arr, index)
SetObjectArrayElement(arr, index, val)
NewBooleanArray(len)
NewByteArray(len)
NewCharArray(len)
NewShortArray(len)
NewIntArray(len)
NewLongArray(len)
NewFloatArray(len)
NewDoubleArray(len)
GetBooleanArrayElements(arr, isCopy)
GetByteArrayElements(arr, isCopy)
GetCharArrayElements(arr, isCopy)
GetShortArrayElements(arr, isCopy)
GetIntArrayElements(arr, isCopy)
GetLongArrayElements(arr, isCopy)
GetFloatArrayElements(arr, isCopy)
GetDoubleArrayElements(arr, isCopy)
ReleaseBooleanArrayElements(arr, elems, mode)
ReleaseByteArrayElements(arr, elems, mode)
ReleaseCharArrayElements(arr, elems, mode)
ReleaseShortArrayElements(arr, elems, mode)
ReleaseIntArrayElements(arr, elems, mode)
ReleaseLongArrayElements(arr, elems, mode)
ReleaseFloatArrayElements(arr, elems, mode)
ReleaseDoubleArrayElements(arr, elems, mode)
GetBooleanArrayRegion(arr, start, l, buf)
GetByteArrayRegion(arr, start, len, buf)
GetCharArrayRegion(arr, start, len, buf)
GetShortArrayRegion(arr, start, len, buf)
GetIntArrayRegion(arr, start, len, buf)
GetLongArrayRegion(arr, start, len, buf)
GetFloatArrayRegion(arr, start, len, buf)
GetDoubleArrayRegion(arr, start, len, buf)
SetBooleanArrayRegion(arr, start, l, buf)
SetByteArrayRegion(arr, start, len, buf)
SetCharArrayRegion(arr, start, len, buf)
SetShortArrayRegion(arr, start, len, buf)
SetIntArrayRegion(arr, start, len, buf)
SetLongArrayRegion(arr, start, len, buf)
SetFloatArrayRegion(arr, start, len, buf)
SetDoubleArrayRegion(arr, start, len, buf)
RegisterNatives(clazz, methods, nMethods)
UnregisterNatives(clazz)
MonitorEnter(obj)
MonitorExit(obj)
GetJavaVM(vm)
GetStringRegion(string, start, len, buf)
GetStringUTFRegion(string, start, len, buf)
GetPrimitiveArrayCritical(arr, isCopy)
ReleasePrimitiveArrayCritical(arr, carray, mode)
GetStringCritical(string, isCopy)
ReleaseStringCritical(string, cstring)
NewWeakGlobalRef(obj)
DeleteWeakGlobalRefjweak(ref)
ExceptionCheck()
NewDirectByteBuffer(address, capacity)
GetDirectBufferAddress(buf)
GetDirectBufferCapacity(buf)
GetObjectRefType(obj)
GetModule(vm)
EndInterface
; End-------------------------------------------------------------------
Code: Select all
; Begin-----------------------------------------------------------------
; Includes--------------------------------------------------------------
XIncludeFile "jni.pbi"
; Sub CallJava----------------------------------------------------------
Procedure CallJava()
; Constants-----------------------------------------------------------
Enumeration
#JVM
EndEnumeration
; Variables-----------------------------------------------------------
Protected jvm.JNIInvokeInterface
Protected env.JNINativeInterface
Protected vm_args.JavaVMInitArgs
Dim options.JavaVMOption(1)
Protected res.i
Protected JavaClassPath.s = "-Djava.class.path=."
If OpenLibrary(#JVM, "c:\\Program Files\\Java\\jdk-10.0.1\\bin\\server\\jvm.dll") = 0
Debug "Can not open JVM.dll"
ProcedureReturn
EndIf
options(0)\optionString = @JavaClassPath
vm_args\nOption = 1
vm_args\options = options()
vm_args\version = #JNI_VERSION_10
vm_args\ignoreUnrecognized = #JNI_TRUE
res = CallFunction(#JVM, "JNI_CreateJavaVM", @jvm, @env, @vm_args)
If res = #JNI_OK
Debug jvm
Debug env
Debug Hex(env\GetVersion())
If Not jvm\DestroyJavaVM() = #JNI_OK
Debug "Can not destroy JVM"
EndIf
Else
Debug "Can not create JVM"
EndIf
CloseLibrary(#JVM)
EndProcedure
; Main------------------------------------------------------------------
CallDebugger
CallJava()
; End-------------------------------------------------------------------
End