2016-05-30 5 views
2

は、機能の多くは、このクラスtest.MyClassからメソッドを使用しているが、それは非常に遅いだと私はタイミングの改善を期待してJNIでコーディングしたい...ライブラリクラスを置き換える方法はありますか?

を交換する方法があることを言うことができますtest.MyClassライブラリを変更する必要はありませんが、ライブラリのコードでは、今から特定のメソッドのネイティブ実装で新しいtest.MyClassを使用しますか?それは古典的な "PCは大丈夫だが、Androidのタイミングは駄目だ"問題だ。

+3

ほとんどの場合、JNIではタイミングが改善されません。ネイティブメソッドを呼び出すのにはオーバーヘッドがあるので、それを悪化させることさえあります。あなたはそれが古典的ではないと確信していますか?私のアルゴリズムは悪いですが、処理能力がより高いのでPC上では見えませんか? – zapl

答えて

-1

オーバーライドしたいパッケージと同じパッケージ/階層構造でtest.MyClassを作成してください。 classloaderはまず実装をロードし、他のライブラリからロードしようとすると、クラスパスにロードされるインスタンスが1つしかないため、ロードは失敗します。

+0

いつもそんなに簡単なわけではありません。 VMは、2つのクラスが同じパッケージ内にあるかどうかを判断するときに、ペア{package_name、classloader}を考慮します。クラスローダが異なると、VMはそれらを同じ名前の独立したクラスとして見て、両方がロードされることを意味します。 java.lang.Stringを置き換えようとすると、相互に作用しない2つの別々のStringクラスになります。これは、 "app string"をコアクラスのものに渡そうとすると問題になりますまたはその逆。 (いくつかのファンキーなエッジケースがあります...私はこれをすることをお勧めしません) – fadden

+0

例:https://android.googlesource.com/platform/dalvik/+/kitkat-mr2-release/tests/068-classloader/ – fadden

関連する問題