2012-11-20 59 views
2

我想从java(android)代码调用本地C++方法,并将java函数作为参数传递,以便我可以将函数指针保存在C++代码,并从本机代码中激活它。如何将java函数指针传递给C++本机代码

我选择了实现使用匿名类在Java中的函数指针,我调用本机的功能从Java如下:

interface FunctionPtrHelper { 
bool function(String param); 

}

NativeFunc(param1,param2,new FunctionPtrHelper() { 
public bool myFunction(String param) { 
    //body of my function 
}}); 

我怎样才能让痛饮/ JNI知道第三个参数(它实际上是一个类)并将其转换为C++中的函数指针(它将包含'myFunction')?
万一不可能,是否有另一种方法将函数指针从java传递给C++?

+3

我不知道JNI这样工作。您正在使用jobject作为参数调用本地方法。在这个对象上,你可以像平常一样调用一个方法,知道它的名字和签名。 –

+0

也可以使用[JavaCPP](http://code.google.com/p/javacpp/#Creating_Callback_Functions)轻松创建回调。让我知道你是否想要更多细节! –

回答

4

您可以将C++接口和SWIG编写为“导演”类。然后你可以在Java中实现接口。在Java中实例化实现对象,并将其传递给一个C++方法,该方法接受指向接口的指针或引用,并且C++将能够回调到Java类中。例如:

// SWIGed C++ 
class IStringToBool 
{ 
public: 
    virtual bool call(std::string s) = 0; 
} 

class IStringToBoolUser 
{ 
public: 
    void setFunction(IStringToBool &function); 
} 

然后:

// Java 
public class MyFunction implements IStringToBool { 
    public bool call(String s) { 
     // do something 
     return true; 
    } 
} 

文档:Cross language polymorphism using directors

0

使用JNI,您可以将对象传递给C++,然后您可以从C++对象获取函数指针。

+0

你能举个例子吗? – durron597

+0

问题在于,JNI函数指针(例如'CallMethodVoid'等)几乎肯定与您在C++中查找的函数指针不匹配。您至少需要传入'JNIEnv','jobject'和'jmethodID'。 – Flexo