1

GNU Scientific Library(GSL)を利用するAndroidアプリケーションを作成しようとしています。特に、BLASの実装については「libgslcblas.so」に興味があります。私はAndroidNDKを利用して、ライブラリをロードし、適切な関数呼び出しを行うJavaプログラムを作成することにしました。

これがどのように機能するかをテストするために、「libm.so」をロードして任意の関数呼び出しを行う単純なプログラムを作成しようとしました。これは、私が考えることができるように、NDKの些細なユースケースのように見えましたが、次の問題に遭遇しました。

07-05 18:11:07.264: I/System.out(1298): debugger has settled (1464)
07-05 18:11:07.583: D/dalvikvm(1298): No JNI_OnLoad found in /system/lib/libm.so 0x41345988, skipping init
07-05 18:11:07.903: W/dalvikvm(1298): No implementation found for native Lissm/libctest/LibCtest;.sqrt (D)D

私のコードは次のとおりです。

package issm.libctest;

import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class LibCtest extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        TextView  tv = new TextView(this);
        setContentView(R.layout.activity_lib_ctest);

        double x = sqrt(4);

        tv.setText( "Sine of: " + x);
        setContentView(tv);
    }

    public native double sqrt(double x);

    static
    {
        System.load("/system/lib/libm.so");
    }
}

私は本当に問題を理解していません。私が言ったように、これは私が考えることができるNDKの最も簡単な使用法です。誰かがこの問題を解決するのを手伝ってもらえますか?

ありがとう!

4

2 に答える 2

6

JNIを読んでください。つまり、任意のグローバル C 関数は、NDK を介して Java から呼び出すことはできません。関数を呼び出し可能にするには、次のような非常に具体的なシグネチャが必要です。

void Java_com_mypackage_MyClass_MyMethod(JNIEnv *jni, jobject thiz, jint arg1);

Java 側では、それはMyClasspackage 内のクラスのメソッドになりますcom.mypackage

native void MyMethod(int arg1);

明らかに、バニラsqrtは法案に適合しません. したがって、Java から呼び出す予定のすべての関数に対して、Java に適したラッパーを提供する必要があります。このことを念頭に置いて、単なる数学プリミティブである高レベルの概念のラッパーを提供することをお勧めします。Java/C の境界は乱雑です。交差が少ないほど良いです。

また、ライブラリは Android 専用のソースからビルドする必要があります。NDK にはそのためのツールがあります。別のプラットフォーム (Linux や Windows など) 用の既製のバイナリは使用できません。

編集: javahJDK のツールは、一連の宣言を含む Java クラスを取得し、nativeダミーの実装を含むスケルトン H/C ファイルを作成できます。基本的に、JNI ルールに沿ってメソッド プロトタイプを Java から C に変換します。

于 2012-07-06T01:22:34.480 に答える
0

使用しようとしているライブラリ (およびその依存関係) がターゲット プラットフォーム (Android ネイティブ プラットフォーム) 用にビルドされていることを確認してください。

于 2012-07-06T00:56:53.040 に答える