无法在 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