0

Android SDKのJavaで、ネイティブJNIメソッドとして実装されたJavaクラスのメソッドが静的に解決されたことを確認できるのでしょうか。以下に私が探しているものの説明があります。

JNIクラスとして部分的に実装されているJavaクラスがあります。対応するJNIライブラリが静的ライブラリ(たとえば、libhelper.a)として作成されている場合、このクラスは静的に初期化できます。または、対応するJNIライブラリがダイナミックライブラリ(たとえば、libhelper.so)として実装されている場合は、動的に初期化できます。動的初期化の場合、クラスには動的ライブラリをロードする静的初期化子(libhelper.so)が必要です。私は両方のケースを使用しており、両方に同じソースコードを保持したいと思います。この目的のために、対応するネイティブメソッドがすでに解決されているかどうかを静的初期化子で確認したいと思います。それが本当なら、ダイナミックライブラリをロードする必要はありません。falseの場合は、ダイナミックライブラリをロードする必要があることを意味します。

以下のサンプルには、私の意図を示す誤った行があります。

package com.sample.package;
public class MyUtilityClass 
{
    private static final String TAG = "MyUtilityClass";
    public MyUtilityClass () {
        Log.v(TAG, " MyUtilityClass constructor");     
    }
    public static native int initMyHelperClass();
    public static native int performHelpAction(String action);
    public static native int uninitMyHelperClass();

    static {
        try {
            /* Here I want to verify that the native method 
               initMyHelperClass has has been already resolved.
               In this code snippet I am just comparing it to null,
               which is not correct. It should be something different. */ 
            if (initMyHelperClass == null) {
                /* initMyHelperClass has not been resolved yet,
                   load the dynamic library - libhelper.so */            
                System.loadLibrary("helper");
            }   
        } catch (UnsatisfiedLinkError ule) {
            /*Library not found. We should throw second exception. */
            throw ule;  
        }     
    } 
} 

ありがとうございました。

4

1 に答える 1

1

およびダミー メソッドを使用UnsatisfiedLinkErrorして、特定のクラスのネイティブ メソッドがロードされているかどうかを確認できます。

private static native void checkMe();  // does nothing

static {
    try {
        checkMe();
    } catch (UnsatisfiedLinkError e) {
        System.loadLibrary("checkLibrary");
    }
}
于 2012-04-06T19:40:13.080 に答える