我有一个基于NativeActivity Android示例的NDK Android应用,我需要略微改变NativeActivity
的行为。我不能通过子类化(继承)来做到这一点,因为我想要改变的东西不会暴露。
因此,我的想法是获取 NativeActivity.java 的源代码,稍微重新编写它,然后将其重命名为 MyNativeActivity.java 并将其用于显示而不是NativeActivity
。
所以我从 Android \ sdk \ sources \ android-25 \ android \ app \ NativeActivity.java 获取源代码,将其重命名为 MyNativeActivity.java 并插入进入我的项目。但是当我尝试编译它时,我遇到了错误:
Error:(179, 41) error: cannot find symbol method getLdLibraryPath()
Error:(200, 70) error: cannot find symbol method getNativePtr()
Error:(295, 59) error: cannot find symbol method getNativePtr()
Error:(301, 61) error: cannot find symbol method getNativePtr()
我在源代码文件夹中找不到这些getLdLibraryPath()
和getNativePtr()
( Android \ sdk \ sources \ android-25 )
我的问题是,是否可以在我的项目中使用Android源代码,以及如何处理这样的问题?
答案 0 :(得分:0)
我的问题是,是否可以在我的项目中使用Android源代码
这取决于源代码的范围和内容。
但是当我尝试编译它时,我遇到了错误:
这些是对native
方法的引用。您需要找到实现这些方法背后的函数的JNI代码,并将其添加到NDK项目中,然后修改MyNativeActivity.java
以引用您的库。
我并不抱太大的希望,这将证明是实用的。
答案 1 :(得分:0)
上述方法在源代码中使用@hide进行了注释,这意味着它们会从Android SDK .jars中删除。它们仍应在运行时可用。您可以使用反射来调用它们,如下所示:
private static long callGetNativePtrOnInputQueue(InputQueue inputQueue) {
Class clazz = Class.forName("android.view.InputQueue");
Method method = clazz.getMethod("getNativePtr");
Object returnValue = method.invoke(inputQueue);
if(returnValue instanceof Long)
return ((Long)returnValue).longValue();
return 0;
}
但是,这些方法不属于公共API,并且将来可能会被删除/重命名。