У меня есть код на Фортране, который я пытаюсь обернуть в код Java / Scala. Моя проблема заключается в том, что состояние переменной в Fortran сохраняется, даже если я располагаю библиотеку между двумя вызовами:
Fortran-Code:
subroutine mySub()
implicit none
DOUBLE PRECISION x
COMMON/myCommon/ x
print*,x
x = 99.99
end subroutine mySub
И Java / Scala Код :
trait FortranLibrary extends Library {
// native symbols
def mysub_()
}
def main(args: Array[String]): Unit = {
var INSTANCE: FortranLibrary = Native.synchronizedLibrary(
Native.load("sub.so", classOf[FortranLibrary])
).asInstanceOf[FortranLibrary]
// call native subroutine
INSTANCE.mysub_()
println("------SECOND CALL-----")
// clean library, reload
INSTANCE = null
System.gc()
// make new instance
INSTANCE = Native.synchronizedLibrary(
Native.load(libpath, classOf[FortranLibrary])
).asInstanceOf[FortranLibrary]
// call native subroutine
INSTANCE.mysub_()
}
Вывод на консоль:
0.000000000000000E+000
------SECOND CALL-----
99.9899978637695
Таким образом, ранее установленный x = 99,99 все еще присутствует во втором вызове, даже если библиотека расположена, как предложено в Как избавиться от библиотеки, загруженной с помощью JNA , как этого избежать?
РЕДАКТИРОВАТЬ: я использую компилятор Intel Fortran с -init:zero
, поэтому переменные должны быть повторно инициализированы с 0