What is the Way to Call Java Virtual Machine (JVM) 10

Just starting out? Need help? Post your questions and find answers here.
User avatar
Stefan Schnell
User
User
Posts: 85
Joined: Wed May 07, 2003 2:53 pm
Location: Germany - Oberirsen
Contact:

What is the Way to Call Java Virtual Machine (JVM) 10

Post by Stefan Schnell »

Hello community,

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