相关疑难解决方法(0)

回调作为C结构的参数 - Java包装器生成

感谢@flexo,当自由函数作为参数传递给另一个函数时,我对简单的回调没有任何问题.

但假设C接口比较困难:

typedef struct
{
    int id;
    const char* name;
} Item;

typedef struct
{
    int value;
    Items_Callback callback;
    void *context;
} Items_Call;

typedef int (*Items_Callback)(const Item *item, void *context);

int Items_create(const Item *item, Items_Call *call) {
  ...
  call->callback(item, call->context);
  ...
}
Run Code Online (Sandbox Code Playgroud)

我打算为这样的代码生成一些不错的Java包装器.我假设有结果

class Item {
  public int id;
  public String name;
}

class Items_Call {
  public int value;
  public Object context;
  public Interface callback;
  public void setInterface(Interface i){ callback=i; };
}

public interface Interface {
  public int …
Run Code Online (Sandbox Code Playgroud)

c java java-native-interface swig

7
推荐指数
1
解决办法
794
查看次数

将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;
}
Run Code Online (Sandbox Code Playgroud)

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 );
}
Run Code Online (Sandbox Code Playgroud)

我在Java中已经拥有的是:

public static void message_handler(def.SWIGTYPE_p_context_t ctx, def.SWIGTYPE_p_queue_t node, String data ) {}
Run Code Online (Sandbox Code Playgroud)

这应该以与上面C代码相同的方式注册为回调,现在是Java:

net.register_message_handler(ctx, message_handler);
Run Code Online (Sandbox Code Playgroud)

我发现的是 http://www.swig.org/Doc1.3/SWIGDocumentation.html#SWIG_nn30,包括本章末尾的未定义引用:"现在,关于函数指针支持的最后一点说明.虽然SWIG没有通常允许回调函数以目标语言编写,这可以通过使用类型映射和其他高级SWIG功能来完成.这将在后面的章节中描述.这指的是哪里?

我还找到了一个C++解决方案,但有没有办法让它适应C? Swig c ++ w/Java在多态回调函数 morphic-callback-functions 上丢失类型

谢谢你的帮助.

java java-native-interface swig function callback

6
推荐指数
1
解决办法
3951
查看次数

SWIG C函数指针和JAVA

我在C中有一些代码,其中一个方法有一个函数指针作为参数.我正在尝试在我的Android应用中使用C代码.

我决定使用SWIG来完成生成我需要的java文件的所有工作.一切都适用于常规函数(没有函数指针作为参数的函数).

但我不知道如何将我的JAVA方法作为回调函数传递给C函数.

这是一个例子:

这是我的multiply.h文件

typedef int (*callback_t) (int a, int b, int c);

int foo(callback_t callback);
Run Code Online (Sandbox Code Playgroud)

这是我的multiply.c文件

#include <stdio.h>
#include "multiply.h"

int foo(callback_t callback)
{
    return callback(2, 4, 6);
}
Run Code Online (Sandbox Code Playgroud)

这是我的接口文件multiply-swig.i

%module example
 %{
 /* Includes the header in the wrapper code */
 #include "multiply.h"
 %}

 /* Parse the header file to generate wrappers */
 %include "multiply.h"
Run Code Online (Sandbox Code Playgroud)

然后我运行以下swig命令来生成我需要的java文件

swig -java -package com.example.ndktest -o multiply-wrap.c mulitiply-swig.i 
Run Code Online (Sandbox Code Playgroud)

然后swig生成以下文件:

example.java

package com.example.ndktest;

public class example {
  public static int foo(SWIGTYPE_p_f_int_int_int__int callback) { …
Run Code Online (Sandbox Code Playgroud)

java android swig function-pointers

5
推荐指数
1
解决办法
1562
查看次数

使用SWIG创建java共享库时出现SIGSEGV错误

所以,我正在尝试使用SWIG将C库(libnfc)移植到Java.

我已经到了编译共享库的地步,并且基本的"nfc_version()"方法调用将起作用.但是,调用"nfc_init()"进行设置会导致SIGSEGV错误.直接调用nfc库很好.

我用来生成共享库的命令:

swig -java -I../libnfc/include nfclib.i 
gcc -c -I/usr/lib/jvm/java-7-openjdk-i386/include/ -I/usr/lib/jvm/java-7-openjdk-i386/include/linux nfclib_wrap.c
gcc -shared nfclib_wrap.o ../build/libnfc/libnfc.so libnfc_wrap.so
Run Code Online (Sandbox Code Playgroud)

libnfc.i文件:

%module nfc
%{
#include <nfc/nfc.h>
#include <nfc/nfc-types.h>
#include <nfc/nfc-emulation.h>
%}

%include <nfc/nfc.h>
%include <nfc/nfc-types.h>
%include <nfc/nfc-emulation.h>
Run Code Online (Sandbox Code Playgroud)

即它应该包括libnfc提供的所有方法.

这是我得到的错误日志:http://openetherpad.org/AyVDsO4XTg

显然,可能无法从我提供的信息中获得特定的解决方案.但任何有关尝试的事情的建议都会非常感激(我的知识就在这里).

java swig nfc segmentation-fault

3
推荐指数
1
解决办法
833
查看次数