【发布时间】:2014-08-17 05:10:52
【问题描述】:
我正在制作软件(适用于 Android)以从传感器中读取仪表值。 该软件预计会经常接收更新,以支持更多传感器。读取这些传感器的仪表数据的功能是在应用程序运行时下载的本机库中实现的。
我有一个共享对象列表和一个应该调用的入口函数(返回值被保存):
libprintf.so,hookPrintf
libharx.so,hookHarx
每个库在运行时加载:System.loadLibrary("printf");
每个函数的签名如下所示:
public native int hookPrintf();
public native int hookHarx();
问题是我事先(在编译时)不知道必须加载哪些共享对象,因此我无法在 java 源代码中添加这些签名。
我尝试使用反射来动态调用方法,如下所示:
Method entryMethod = Expat.class.getMethod(hookMethod);
Object test = entryMethod.invoke(this);
System.out.writeln(test.toString());
但是,如果签名不存在,这仍然会失败并出现 NoSuchMethodException。有没有另一种方法可以调用原生方法而无需事先定义它们?
编辑: 使用 RegisterNatives 函数,我可以从共享对象动态注册我的函数,但这仍然需要在类中定义方法签名。 What does the registerNatives() method do?
【问题讨论】:
标签: java c java-native-interface