gpt4 book ai didi

java - 无法借助 JNA 库访问内存引用

转载 作者:行者123 更新时间:2023-12-02 09:34:55 26 4
gpt4 key购买 nike

我正在尝试通过 JNA 访问这段 C++ 代码.dll 文件中编写的库

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" 包装器

对于以下项目树

.
|-- 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

和以下代码

斯卡拉

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);
}
}

native 代码如下所示

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

关于java - 无法借助 JNA 库访问内存引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57611181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com