2012-04-06 9 views
0

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

私は部分的に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; 
     }  
    } 
} 

ありがとうございます。

+1

私はあなたが静的ライブラリによって何を意味するのか理解していません。 JNIは、常に動的ライブラリを使用してロードされます。または、JVMを再リンクしていますか? –

+0

こんにちはキース、あなたは正しいです。私の質問は間違っています。私はそれを再調整する必要があります。静的ライブラリとは関係ありません。特定のJNIメソッドが解決され、追加のライブラリの負荷を必要としないことが検証に関するものです。 私は2つのアプローチがあるとしましょう: (1)1つのダイナミックライブラリlibcombined.soにlibhelper.aと他の静的ライブラリが含まれています。 (2)特定のクラスのオブジェクトが作成されているときにオンデマンドでロードされる複数の動的ライブラリ。 libhelper.soはその1つです。 (1)の場合、私はlibhelper.soをロードする必要はありません。 場合(2)私はlibhelper.soをロードする必要があります。 – MikhailV

+0

それに応じて質問を編集してください。 – EJP

答えて

1

あなたは与えられたクラスのネイティブメソッドがロードされているかどうかを確認するUnsatisfiedLinkErrorとダミーメソッドを使用することができます。

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

static { 
    try { 
     checkMe(); 
    } catch (UnsatisfiedLinkError e) { 
     System.loadLibrary("checkLibrary"); 
    } 
} 
+0

ありがとうございます。ハックのように見えますが、うまくいきます。もう一つの方法はlibhelper.soの存在を検証することですが、あなたの方法はより明確です。乾杯。 – MikhailV