私はC言語でいくつかのコードを持っていますが、メソッドの1つに引数として関数ポインタがあります。私はAndroidアプリでCコードを使用しようとしています。SWIG C関数ポインタとJAVA
SWIGを使用して、必要なJavaファイルを生成するすべての作業を行うことにしました。すべてが通常の関数(引数として関数ポインタを持たない関数)でうまくいきます。
しかし、C関数へのコールバックとしてJAVAメソッドをどのように渡すことができるのかよく分かりません。ここで
は一例です。ここ
は私のmultiply.hファイルはここに
typedef int (*callback_t) (int a, int b, int c);
int foo(callback_t callback);
であるここに私のmultiply.cファイル
#include <stdio.h>
#include "multiply.h"
int foo(callback_t callback)
{
return callback(2, 4, 6);
}
は私のインターフェイスファイル乗算-がぶ飲みです。 i
%module example
%{
/* Includes the header in the wrapper code */
#include "multiply.h"
%}
/* Parse the header file to generate wrappers */
%include "multiply.h"
は、私が
swig -java -package com.example.ndktest -o multiply-wrap.c mulitiply-swig.i
を必要とするJavaファイルを生成するには、次のがぶ飲みのコマンドを実行し、次のファイルが生成さSWIG:
example.java
package com.example.ndktest;
public class example {
public static int foo(SWIGTYPE_p_f_int_int_int__int callback) {
return exampleJNI.foo(SWIGTYPE_p_f_int_int_int__int.getCPtr(callback));
}
}
exampleJNI.java
をpackage com.example.ndktest;
public class exampleJNI {
public final static native int foo(long jarg1);
}
SWIGTYPE_p_f_int_int_int__int.java
package com.example.ndktest;
public class SWIGTYPE_p_f_int_int_int__int {
private long swigCPtr;
protected SWIGTYPE_p_f_int_int_int__int(long cPtr, boolean futureUse) {
swigCPtr = cPtr;
}
protected SWIGTYPE_p_f_int_int_int__int() {
swigCPtr = 0;
}
protected static long getCPtr(SWIGTYPE_p_f_int_int_int__int obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
}
私のjavaコードからこのfoo
メソッドを呼び出すにはどうすればよいですか?引き数の型はSWIGTYPE_p_f_int_int_int__int
ですか?私は、明らかに感謝
Javaで同様の使用例の作業例を書いています。http://stackoverflow.com/a/12251183/168175 – Flexo