无法在 JNA 库的帮助下访问内存引用
Unable to access Memory reference with help of JNA library
我正在尝试通过 JNA 以 .dll 文件编写的库访问这段 C++ 代码
bool Services::ReverseString(const std::wstring &strIn)
{
return true;
}
我的scala代码写在下面
trait CoreServices extends Library{
def ReverseString(m:WString):Boolean
}
val librarypath = "somepath"
System.setProperty("jna.library.path", librarypath)
val libc = Native.load("Services", classOf[CDocuLinkCoreServices])
val x=libc.ReverseString(new WString("dddd"))
但我收到以下错误
java.lang.error invalid memory access
我是 JNA 的新手。任何帮助将不胜感激。
我怀疑您是否可以在不使用 C
样式命名约定的情况下从 Scala
调用 C++
代码。我想,去这里的唯一方法是通过 extern "C"
wrapper
对于以下项目树
.
|-- Makefile
|-- c
| `-- Services.cc
|-- jar
| `-- jna-5.4.0.jar
|-- lib
| |-- libServices.dylib
| `-- libServices.dylib.dSYM
| `-- Contents
| |-- Info.plist
| `-- Resources
| `-- DWARF
| `-- libServices.dylib
`-- scala
| `-- jna_call.scala
`-- target
和以下代码
Scala
import com.sun.jna.Library
import com.sun.jna.WString
import com.sun.jna.Native
trait Services extends Library {
def ReverseStringWrapper(m:WString) : Boolean
}
object JNA {
def main(args:Array[String]):Unit = {
println("Testin JNA!! ")
val librarypath = "./lib"
System.setProperty("jna.library.path", librarypath)
val libc = Native.load("Services", classOf[Services])
val x=libc.ReverseStringWrapper(new WString("dddd"))
println("Result: " + x);
}
}
本机代码如下所示
C++
#include <string>
class Services {
public:
bool ReverseString(const std::wstring &strIn);
};
bool Services::ReverseString(const std::wstring &strIn)
{
return true;
}
extern "C" {
bool ReverseStringWrapper(const std::wstring &strIn)
{
Services s;
return s.ReverseString(strIn);
}
}
正在按照以下方式构建库
> c++ -std=c++11 -g -shared \
-fpic -I${JAVA_HOME}/include \
-I${JAVA_HOME}/include/$(ARCH) \
c/Services.cc -o lib/libServices.dylib
而 Scala
代码按以下方式编译
> scalac -d target -classpath "jar/jna-5.4.0.jar" scala/jna_call.scala
并这样执行
> scala -classpath "./target:jar/jna-5.4.0.jar" JNA
Testin JNA!!
Result: true
一切如预期。
您可以在此处找到完整的示例代码:https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo054
我正在尝试通过 JNA 以 .dll 文件编写的库访问这段 C++ 代码
bool Services::ReverseString(const std::wstring &strIn)
{
return true;
}
我的scala代码写在下面
trait CoreServices extends Library{
def ReverseString(m:WString):Boolean
}
val librarypath = "somepath"
System.setProperty("jna.library.path", librarypath)
val libc = Native.load("Services", classOf[CDocuLinkCoreServices])
val x=libc.ReverseString(new WString("dddd"))
但我收到以下错误
java.lang.error invalid memory access
我是 JNA 的新手。任何帮助将不胜感激。
我怀疑您是否可以在不使用 C
样式命名约定的情况下从 Scala
调用 C++
代码。我想,去这里的唯一方法是通过 extern "C"
wrapper
对于以下项目树
.
|-- Makefile
|-- c
| `-- Services.cc
|-- jar
| `-- jna-5.4.0.jar
|-- lib
| |-- libServices.dylib
| `-- libServices.dylib.dSYM
| `-- Contents
| |-- Info.plist
| `-- Resources
| `-- DWARF
| `-- libServices.dylib
`-- scala
| `-- jna_call.scala
`-- target
和以下代码
Scala
import com.sun.jna.Library
import com.sun.jna.WString
import com.sun.jna.Native
trait Services extends Library {
def ReverseStringWrapper(m:WString) : Boolean
}
object JNA {
def main(args:Array[String]):Unit = {
println("Testin JNA!! ")
val librarypath = "./lib"
System.setProperty("jna.library.path", librarypath)
val libc = Native.load("Services", classOf[Services])
val x=libc.ReverseStringWrapper(new WString("dddd"))
println("Result: " + x);
}
}
本机代码如下所示
C++
#include <string>
class Services {
public:
bool ReverseString(const std::wstring &strIn);
};
bool Services::ReverseString(const std::wstring &strIn)
{
return true;
}
extern "C" {
bool ReverseStringWrapper(const std::wstring &strIn)
{
Services s;
return s.ReverseString(strIn);
}
}
正在按照以下方式构建库
> c++ -std=c++11 -g -shared \
-fpic -I${JAVA_HOME}/include \
-I${JAVA_HOME}/include/$(ARCH) \
c/Services.cc -o lib/libServices.dylib
而 Scala
代码按以下方式编译
> scalac -d target -classpath "jar/jna-5.4.0.jar" scala/jna_call.scala
并这样执行
> scala -classpath "./target:jar/jna-5.4.0.jar" JNA
Testin JNA!!
Result: true
一切如预期。
您可以在此处找到完整的示例代码:https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo054