0

我正在使用 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);

我去过这个线程,但仍然不知道该怎么做。我正在做的事情和他们正在做的事情之间的区别在于,我想在 C 中调用一个需要函数指针作为参数的本机函数。

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

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

1 回答 1

2

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

库中的进程级静态状态也会让你很头疼,因为 android 不会将进程的生命周期与用户可感知的会话生命周期联系起来。Android 也很乐意将多个不同的会话放入同一个进程中。

于 2012-07-10T14:38:50.337 回答