FFI:size_t
在通过 jRuby 运行 rails 时可以理解,但在使用 Warbler 创建 .war 文件并使用java -jar my_project.war
Tomcat 运行该文件后则不理解。
Linux | Windows
-----------------------------+-------------
java -jar works | doesn't work
tomcat works | doesn't work
rails s (using jruby) works | works
Linux 和 Windows 在比较中使用相同的 war 文件。
java -jar
这是在 Windows 上运行的回溯的顶部。(我在回溯中编辑了文件路径的开头)。
--- Backtrace
TypeError: unable to resolve type 'size_t'
find_type at jar:file:/my_project.war/WEB-INF/lib/jruby-stdlib-1.7.2.jar!/META-INF/jruby.home/lib/ruby/shared/ffi/types.rb:55
type_size at jar:file:/my_project.war/WEB-INF/lib/jruby-stdlib-1.7.2.jar!/META-INF/jruby.home/lib/ruby/shared/ffi/types.rb:147
SQLAnywhere at my_project.war/WEB-INF/gems/gems/sqlanywhere-ffi-1.0.1/lib/sqlanywhere.rb:13
(root) at my_project.war/WEB-INF/gems/gems/sqlanywhere-ffi-1.0.1/lib/sqlanywhere.rb:5
require at org/jruby/RubyKernel.java:1027
当我查看回溯中的文件时,它们列出了各种 c 类型,但没有列出size_t
.
在我看来,jRuby 有 2 个 FFI 可用。
- 普通的FFI 宝石。
- jruby-stdlib ffi。
两者最大的区别,似乎只有前者懂:size_t
。
我的问题是:是否有 2 种不同的 FFI?如果是这样:我如何确保我的 gem 加载正确的 ffi?如果不是:我做错了什么?
PS:我是 sqlanywhere-ffi gem 的作者,所以如果问题是我依赖于错误的东西,我可以更改它。目前它在 gemspec、gemfile 和requires 'ffi'
主入口点中具有 ffi 作为依赖项。