Tag: swig

如何使用Swig将数组从Java传递到C ++?

我在C ++中有一个方法,它接受一个双精度数组作为参数。 我从Java调用这个方法,需要传递一个双精度数组。 C ++例程读取并修改数组的值,我需要Java中的更新值。 我该怎么做呢? 例如,采用C ++例程: void myMethod( double *values, int size ) { for ( int i=0; i < size; i++ ) { values[i] = 2*values[i]; } } 和Java代码: double[] values = { 1.3, 1.1 }; myMethod(values,values.length); System.out.println(values[0]); // prints 2.6 我想对myMethod的调用无法像上面的调用一样……或者可以吗? 而Swig有必要做到这一点。 如果我不能像上面那样打电话,我如何获得C ++代码的值?

如何让Swig正确地将在C中修改的char *缓冲区包装为Java Something-other?

我正在尝试包装一些用于Java的遗留代码,我很高兴看到Swig能够处理头文件并生成一个几乎可以工作的好包装器。 现在我正在寻找能让它真正发挥作用的深刻魔法。 在CI中有一个看起来像这样的function DLL_IMPORT int DustyVoodoo(char *buff, int len, char *curse); 此函数返回的此整数是一个错误代码,以防它失败。 争论是 buff是一个字符缓冲区 len是缓冲区中数据的长度 curse另一个包含调用DustyVoodoo结果的字符缓冲区 所以,你可以看到它的发展方向,结果实际上是通过第三个参数返回的。 len也是令人困惑的,因为它可能是两个缓冲区的长度,它们总是在调用代码中被分配为相同的大小,但是考虑到DustyVoodoo我不认为它们需要相同。 为了安全起见,两个缓冲区在实践中应该是相同的大小,比如512个字符。 为绑定生成的C代码如下: SWIGEXPORT jint JNICALL Java_pemapiJNI_DustyVoodoo(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2, jstring jarg3) { jint jresult = 0 ; char *arg1 = (char *) 0 ; int arg2 ; char *arg3 = (char *) 0 […]

将java函数注册为C函数中的回调函数

我试图使用SWIG 1.3在Java中实现一些C代码。 现在我必须将一些现有的C重建为Java代码,并为C方法提供指向Java函数的函数指针。 C代码:net.c: void register_message_handler( context_t *ctx, message_handler_t handler) { context->msg_handler = (void (*)( void *, coap_queue_t *, void *)) handler; } client.c: void message_handler(context_t *ctx, queue_t *node, void *data) { … } int main(int argc, char **argv) { // setup ctx register_message_handler( ctx, message_handler ); } 我在Java中已经拥有的是: public static void message_handler(def.SWIGTYPE_p_context_t ctx, def.SWIGTYPE_p_queue_t […]

使用SWIG与arrays交互的正确方法

我在swig中使用类型图以及如何使用数组时有点迷失。 我已经准备了一个使用swig在java和c之间使用数组的工作示例,但我不知道它是否是正确的方法。 基本上我想将一个字节数组byte[]从java传递给c作为符号char *`+它的大小,在c中修改它并查看java中的更改并在c中创建一个数组并在Java中使用它。 我看一下theese的问题: 如何使用Swig将数组(java中的long数组)从Java传递到C ++ , 将数组作为指针+大小或范围传递给包装函数 , 如何让Swig正确包装char *在C中修改为Java Something-other的缓冲区? 事实上,使用这些解决方案作为制作示例的指南。 这是我在文件arrays.h中的代码: #include bool createArray(signed char ** arrCA, int * lCA){ *lCA = 10; *arrCA = (signed char*) calloc(*lCA, sizeof(signed char)); for(int i = 0; i < *lCA; i++){ (*arrCA)[i] = i; } return *arrCA != NULL; } bool readArray(const signed char […]

如何在SWIG生成的Java绑定中转换为SWIGTYPE_p_void类型?

我正在为C库开发一些SWIG生成的Java绑定。 该库包含void *类型参数的函数。 在C端,这些通常作为指向float类型的数组的指针传递或int cast to void * 。 在生成的Java绑定中,这会产生采用SWIGTYPE_p_void类型参数的方法。 在Java绑定中构造浮点数/整数数组的最佳方法是什么,以便它们可以作为SWIGTYPE_p_void类型SWIGTYPE_p_void给这些方法? 目前我正在我的example.i文件中定义一个辅助函数: void *floata_to_voidp(float f[]) { return (void *)f; } 然后在Java端做这样的事情: float foo[] = new float[2]; SWIGTYPE_p_void av = null; // do something with foo av = example.floata_to_voidp(foo); example.myfunction(av); 这看起来相当丑陋,特别是因为我还需要在我的SWIG接口文件中为每个我希望支持的类型转换使用inta_to_voidp()等。 有没有办法在没有辅助函数的情况下执行此操作,并且在Java端涉及更少的额外代码来转换数据类型? 更新(17/6/12):给出问题的更多细节:我要做的是采用一组C函数,原型为int foo(const float *data, int N, const void *argv, float *result)并将它们映射到Java端的方法,其中任意类型的数组可以作为argv传入。 请注意, argv是const void […]

使用SWIG的C函数的JNI包装器 – 应该是什么类型图?

我正在尝试为C中的以下函数创建JNI包装器: int err = new_instance(const char* name, instance_t* instance); name – 输入, instance – 输出 int err = get_value(const instance_t instance, int *val); instance – 输入, val – 输出 其中instance_t定义为: typedef void* instance_t; 我完全迷失在Java的SWIG手册中,因为它不仅仅支持输入参数作为输出类型。 我用Python包装器没有任何问题(如下所示)。 在Java的情况下使用typemap的正确方法是什么? // instance_t [argout] %typemap(in, numinputs=0) instance_t* instance (instance_t temp = 0) { $1 = &temp; } %typemap(argout) instance_t *instance […]

如何使用SWIG包装std :: function对象?

我已经看到了很多类似的问题,但是没有找到解决我特定问题的方法。 我试图SWIGify一些使用std :: function的C ++ 11代码,所以我可以在我的Java应用程序中使用它。 我遇到过像这样的共享指针: virtual std::shared_ptr getTheThing(unsigned short thingID); 并使用shared_ptr指令成功处理它们,如下所示: %shared_ptr(some::ns::TheThing); 我遇到过这样的共享指针向量: virtual std::vector<std::shared_ptr> getAllTheThings() const = 0; 并使用如下模板成功处理它们: %template(ThingVector) std::vector<std::shared_ptr>; 现在我有一个像这样的方法: void registerThingCallback(std::function<void(std::shared_ptr) > func); 我无法让SWIG正确包装它。 我已经尝试使用%回调,导演,%模板和%内联function代码,因为我已经看到所有这些事情的例子,但是还没有能够得到任何似乎接近工作的东西。 如果有帮助(消毒和减少),这里有一个关于函数调用的更多上下文: thing_callback.h #include namespace some { namespace ns { /** * Hold some callbacks. */ class ThingCallbacks { public: /** * Registers a callback […]

如何使用SWIG将sockaddr_in C结构映射到Java

我有一个C函数,我想通过SWIG使用Java调用,但我不确定如何处理sockaddr_in C结构。 任何人都有关于我如何处理sockaddr_in的任何例子?

如何使用Swig将数组(java中的long数组)从Java传递到C ++

我有样本.h文件,如下所示: class Test { public: void SelectValues(long long values[]) }; 我使用SWIG并从.i文件下面创建了JNI接口 %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 /*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}那样创建长数组,并将其传递给Java方法以上以调用适当的JNI方法。 我希望SWIG以这样一种方式生成接口,我可以将上面提到的数组传递给我的C ++方法。 我已经阅读了这个问题 […]

SWIG:如何包装std :: string&(通过引用传递的std :: string)

我正在使用SWIG从Java访问C ++代码。 公开由非const引用传递的std :: string参数的最简单方法是什么? 感谢stma_string.i,我将原型通过引用传递给Java数组,这要归功于typemaps.i和const std::string& s公开为java.lang.String 。 但是非const std :: string&作为不透明指针类型暴露为SWIGTYPE_p_std__string 。 当前: // C++ method -> // Java wrapper of C++ method void foo( int & i ) -> public void foo( int[] i ); // OK void bar( const std::string & s ) -> public void bar( String s ); // […]