是否可以为我的应用程序修改NativeActivity.java

时间:2018-01-20 11:48:32

标签: android android-ndk

我有一个基于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源代码,以及如何处理这样的问题?

2 个答案:

答案 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,并且将来可能会被删除/重命名。