将函数指针传递给Native函数作为参数

时间:2012-07-10 14:25:40

标签: android function-pointers android-ndk

我正在使用android NDK尝试使用现有的库来构建应用程序。

在库中声明了以下函数...

BYTE __stdcall InitRelay(fp_setbaud _setbaud, fp_get _get, fp_put _put, fp_flush _flush, fp_delay _delay){

这些是传递给InitRelay ...

的参数的声明
typedef void (__stdcall *fp_setbaud)(WORD);
typedef short (__stdcall *fp_get)(WORD);
typedef void (__stdcall *fp_put)(BYTE);
typedef void (__stdcall *fp_flush)(void);
typedef void (__stdcall *fp_delay)(WORD);
 typedef short (__stdcall *fp_ProgressUpdate)(WORD);

我去过this thread,但仍然不确定该怎么做。我正在做什么和他们正在做什么之间的区别在于我想在C中调用一个需要函数指针作为参数的本机函数。

我正在考虑在Native代码中编写一个包装函数,听起来不错吗?我的主要问题是我无法更改我已经给出的本机代码,但我可以添加新功能。我知道人们会要求我发布我的java代码,所以我会,但它实际上没用。它只是一个带有参数的方法调用,这些参数目前对java没有意义。

 // InitRelay
    InitRelay( fp_setbaud _setbaud, fp_get _get, fp_put, fp_flush _flush, fp_delay _delay );

1 个答案:

答案 0 :(得分:2)

是的,写本机包装器。无论如何,您将需要这样做,因为jni对接口函数有非常特殊的命名要求。非平凡数据类型还需要从/到jni引用的复制转换。

库中的进程级静态状态也会给您带来很多麻烦,因为android不会将进程的生命周期链接到用户可感知的会话生存期。 Android也很乐意将多个不同的会话放入同一个流程中。