- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有如下示例 .h 文件:
class Test
{
public:
void SelectValues(long long values[])
};
我使用 SWIG 并从下面的 .i 文件创建了 JNI 接口(interface)
%module MyLib
%include "carrays.i"
%array_functions(long long, long_long_array )
%{
#include "Test.h"
%}
/* Let's just grab the original header file here */
%include <windows.i> /*This line is used for calling conventions*/
% include "Test.h"
当我创建 Java 方法时,它创建如下:
public void SelectValues(SWIGTYPE_p_long_long includeKeys)
对于 JNI 文件,它也将参数作为 jlongArray
,但仅采用简单的 jlong
。由于这个问题,我无法创建像 long[]={1L,2L}
这样的 long 数组并将其传递给上面的 Java 方法以调用适当的 JNI 方法。
我希望 SWIG 以我可以将上述数组传递给我的 C++ 方法的方式生成接口(interface)。
我已阅读 this question ,但它并没有帮助我了解如何将数组从 Java 传递到 C++。
最佳答案
您在这里使用 array_functions
所做的是正确且可用的,但它侧重于直接包装 C++ 代码,并且不会使用底层 Java 数组。您可以将它与类似的东西一起使用:
SWIGTYPE_p_long_long array = MyLib.new_long_long_array(100); // new array with 100 elements.
for (int i = 0; i < 100; ++i) {
long_long_array_setitem(array, i, i);
}
new Test().SelectValues(array);
其中数组只是一个“真正的”C++ 内存块的代理,您可以从 Java 端读取/写入该内存块并将其传递给包装函数。
根据您的问题,我猜测您有兴趣让 Java 方面的感觉更“自然”。 SWIG 还提供了 array_class
,它类似地包装了一个数组,但作为一个适当的对象而不是静态函数的集合。例如,如果您将接口(interface)文件更改为使用 array_class(long long, LongLongArray)
而不是 array_functions
,您可以执行以下操作:
LongLongArray array = new LongLongArray(100);
for (int i = 0; i < 100; ++i) {
array.setitem(i,i);
}
new Test().SelectValues(array.cast());
实际上,如果您愿意,您可以使用一些类型映射让 SWIG 做更多的事情。您的示例类在 SelectValues
中没有占用长度,因此我假设您以 0 终止数组,尽管您同样可以通过一些简单的更改来传递长度。
(为方便起见,我%inline
你的类以减少文件数量并添加了一个虚拟实现以进行测试)
%module MyLib
%{
#include <iostream>
%}
%typemap(jtype) long long values[] "long[]"
%typemap(jstype) long long values[] "long[]"
%typemap(javain) long long values[] "$javainput"
%typemap(jni) long long values[] "jlongArray"
%typemap(in) long long values[] {
jboolean isCopy;
$1 = JCALL2(GetLongArrayElements, jenv, $input, &isCopy);
}
%inline %{
class Test
{
public:
void SelectValues(long long values[]) {
while (*values) {
std::cout << *values++ << "\n";
}
}
};
%}
这里我们说 SWIG 生成的代理类和它生成的 JNI 类都将使用 long[]
,即 Java 数组。我们不需要在 Java 代理到 Java JNI 的转换中做任何事情,所以 javain
类型映射只是一个直接的传递。在 JNI 的 C++ 端,它是一个 jlongArray
,我们也在另一个类型映射中指定了它。
然后我们需要一个 in
类型映射来安排从 jlongArray 到 C++ 端的 long long[]
的转换——只有一个 JNI 调用,我们不需要关心它是我们最终使用的 JVM 的拷贝还是实际内存。 (例如,您可能关心是否要修改结果并使其在 Java 中可见)
我测试了这个:
public class run {
public static void main(String[] argv) {
System.loadLibrary("mylib");
long arr[] = {100,99,1,0}; // Terminate with 0!
new Test().SelectValues(arr);
}
}
这完全符合您的希望。
关于java - 如何使用 Swig 将数组(java 中的 long 数组)从 Java 传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10947560/
我正在制作一个 C++ 库的包装器,以便它可以从 Java 中使用,我正在用 Swig 做这个。 我面临的是我有一个类(class) SomeClass ,它有一些重载的方法( someMethod
我有许多要在 SWIG 中重命名的类。我的大部分类(class)看起来像这样some_class ,我想将其重命名为 SomeClass .这很简单: %replace("%(camelcase)s"
PyPy 有一些 compatibility limitations ,尤其是关于 CPython C API。 我用 QuickFix预编译的 SWIG 绑定(bind)附带的包,我正在考虑将它与
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
使用 SWIG 生成接口(interface)模块时,生成的 C/C++ 文件包含大量静态样板函数。因此,如果想通过在同一个应用程序中使用许多单独编译的小接口(interface)来模块化 SWIG
我正在应用 SWIG 手册中有关嵌套类的解决方法,该部分使用全局内部类。在这里,我将向您展示一个类似于手册中的版本,但为您尽可能地简化了。我还必须将内联定义 {} 添加到 method(),因为没有它
我有一个现有的库 (JPhysX),它是原生 C++ 库 (PhysX) 的 Java 包装器。 Java 库使用 SWIG 生成的类型,例如 com.jphysx.SWIGTYPE_p_NxStre
有没有办法动态向下转换 swig 对象的 swig 代理? 这样做的原因是为了模拟 C++ 向下转换,但纯粹来自 python。例如,典型的 C++ 用法是 MyBase* obj = new MyB
我在远程服务器上工作,所以我在本地安装了 swig,使用 -prefix=/home/user/directory。 我有一个来自同事的 makefile,其中包含以下命令: swig $(SWIG_
据我所知,在用于将 c++ 文件编译为 python 扩展模块的 .i 文件中,我们可以添加一些 python 代码,如下所示(来自 example for adding additional pyt
我的 Swig 文件 (.i) 中有以下代码: %extend vgSofa::handler::VertexShape { vgd::Shp createVSWithNode( so
我有一个用 swig 包装的类的 C++ 代码。我无法修改代码或包装。在 python 中,我使用 ctypes 拥有一个指向所述 C++ 类的实例的指针。如何围绕该指针创建一个 swig 包装器?
我开始掌握 SWIG 的窍门,SWIG 的最新版本 (v3.0) 似乎可以处理我开箱即用所需的一切,包括 C++11 功能,但我遇到了麻烦开始在我的导演类(class)中使用 shared_ptr。
我正在使用 javacode 类型映射来添加一些附加函数来代替 SWIG 生成的函数。我想删除 SWIG 为 unsigned char mac[6]; 生成的默认 getter 和 setter(p
我正在使用 SWIG 为我的 C 库生成 Python 语言绑定(bind)。我已经设法构建了绑定(bind)和导出的数据结构,但在使用该库时我不得不跳过一些障碍。 例如,C 头文件的数据类型和函数原
我最近在node-js应用程序中从jade模板引擎切换到了swig。在使用jade时我使用了命令 jade.render('/sample.jade',{obj:object});渲染模板并传递对象。
我在我的 python 代码中发现了瓶颈,尝试了 Psycho 等。然后决定编写一个 c/c++ 扩展来提高性能。 在 swig 的帮助下,您几乎不需要关心参数等。一切正常。 现在我的问题是:swig
由于 SWIG 无法解析 __attribute__((packed))在我想包装的一些 C 结构上,我通过放置一个 #define __attribute__(x) 在我的.i文件。 这什么时候会来
我有一个包含 C++ header 的 SWIG 文件。 痛饮文件: %module my_module %{ #include "my_c_file.h" %} %include "my_c_fil
我正在尝试学习如何使用 SWIG,并且想知道我是否正在执行一些不需要执行的额外步骤。我目前有文件 Dog.cpp、Dog.h 和 Dog.i。我正在尝试使用 SWIG 包装 Dog.cpp 以便在 P
我是一名优秀的程序员,十分优秀!