我正在编写一个包含大量jni代码的Java库.几乎每个测试用例都需要加载我的jni dll,而且我有很多测试用例.为了从Eclipse的Junit启动程序中运行测试用例,我必须创建一个运行/调试配置并编辑VM参数和环境变量.
我想要一种方法将VM参数和环境变量设置为整个项目的默认值,并且新的运行配置包括默认条目.据我所知,执行环境可能会做这样的事情,但我似乎需要PDE让它们工作(?)
具体来说,我希望默认情况下在我的项目上启用断言,并在PATH环境变量中包含我的本机dll的路径.我不能使用JRE定义面板中的"默认VM参数"设置,因为我的dll依赖于许多其他设置,并且java.library.path不用于依赖项解析,PATH是.有没有办法让Eclipse做我想要的?
我有一个C库,需要一个临时缓冲区用于临时空间.我正在考虑将直接字节缓冲区的地址传递给它.
是否允许VM在最终释放缓冲区之前重新定位缓冲区?在JNI帧消失后,本机库将保持指针.我的理解是无法缓存JNI本地对象引用,因为VM可能在GC期间重定位它们.这适用于缓冲区地址吗?
我知道如果我在Java中分配缓冲区然后让缓冲区对象超出范围,VM将释放缓冲区内存.如果我使用NewDirectByteBuffer在本机代码中创建一个新的缓冲区,它的职责是释放后备内存?
如果我使用NewDirectByteBuffer在本机代码中创建一个新缓冲区并且直接缓冲区已经使用了一个地址,会发生什么?记忆会被双重释放吗?VM引用是否会计算内存块,并在引用它的最后一个缓冲区被垃圾收集时尝试释放它?
我正在使用gfortran的95+扩展.我有一个实用程序模块库,我想链接到其他项目,即作为库或共享对象/ DLL.但是,在Fortran中,我不明白如何在不保留模块接口的两个副本的情况下将接口与Fortran中的实现分开.
在C中,我将接口与实现分开,如:
api.h ?includes? impl.h
? ?
includes includes
? ?
user.c impl.c
Run Code Online (Sandbox Code Playgroud)
有没有办法在现代Fortran中实现相同的效果?我是否需要为用户提供.mod文件?
编辑:总结(我认为是)答案:
需要.mod文件,因为它们包含显式接口定义
模块没有标准的Fortran ABI - .mod文件将是特定于编译器的
实现隐藏问题的唯一直接分析方法是子模块,它在Fortran 2008中定义,并且gfortran不支持.
除了避免使用模块之外,@ High-Performance-Mark和Fedora页面提供的最实用的方法是分发仅用于接口的模块的包含文件以及用于实现的预编译.mods.
使用包含一些众所周知和烦人的旅行,包括潜在的重新定义公共块.
我有点惊讶,这里实际上没有一个简单的答案.
我想在Lua调用的C函数中弹出/清理Lua调用堆栈.这可能吗?
背景:
我希望我的C库及其扩展脚本使用相同的测试框架.(我知道Lua存在各种单元测试工具.我不在乎;我想要一个报告)我将CUnit包装在一层薄薄的Lua中.CUnit提供了致命和非致命测试断言的选择.致命的断言导致立即longjmp退出测试并重新进入框架运行器.如果我没有先清理堆栈,这似乎会对Lua VM做坏事.
堆栈可能看起来像:
#0. C: assert_wrapper_fcn(test, fatal)
#1. Lua: assert_fcn(bool)
#2. Lua: test_fcn()
#3. C: runner(&test_fcn)
Run Code Online (Sandbox Code Playgroud)
我想清理#0和#3之间的所有内容.我知道的方法签名test_fcn()和assert_fcn(bool),但仅此而已.