在Android/dalvik中,是否可以重写Java类的本地方法?

9
我正在使用EasyMock对一个叫做TestMe的类进行单元测试,其中的一个方法(比如说method(N n))期望一个类型为N的参数,该类型具有一个本地方法(比如说nativeMethod())。
class TestMe {
    void method(N n) {
        // Do stuff

        n.nativeMethod();

        // Do more stuff
    }
}

method() 需要在某个时刻调用 N.nativeMethod() ,但我遇到的问题是,我的 Easymock mock 对象无法覆盖原生方法。虽然我没有拥有类 N,但我可以以任何必要的方式重构 TestMe

我决定创建自己的类 FakeN extends N ,它覆盖了 nativeMethod 方法,使其不执行任何操作:

class FakeN extends N {
    FakeN(int pointer) {
        super(pointer);
    }

    @Override
    public void nativeMethod(Object o) {
        // super.nativeMethod() is an actual native method defined as:
        // public native void nativeMethod(Object o)
        //
        // IGNORE
    }
}

虽然编译器没有报错,但当我运行测试时,似乎被调用的是N.nativeMethod(),而不是FakeN的版本。

这里是否有一种解决方法可供使用?

1个回答

8
native 方法和其他方法一样可以被重写,除非它们被声明为 final。只需确保您正在使用 FakeN 的实例调用 TestMe.method(N n)

这是我从这个页面的评论中得出的结论,但似乎并没有起作用。我会回去检查一下是否弄错了什么。 - scorpiodawg
3
原来本地方法可以被非本地方法覆盖,反之亦然。native似乎不是签名的一部分。 - scorpiodawg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接