0

何らかの理由で、メインアクティビティからのみネイティブ関数を呼び出すことができ、作成したカスタムビューは呼び出すことができません。これがサンプルファイルです(チュートリアルに従いましたが、クラスの名前をhttp://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/に変更しました)

ネイティブ関数「getNewString」の使用法を参照してください。

package com.example.native;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.View;

public class NativeTestActivity extends Activity
{   
    static
    {
        System.loadLibrary("nativeTest");
    }

    private native String getNewString();

    @Override public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);        
        this.setContentView(new BitmapView(this));

        String hello = getNewString(); // This line works fine
        new AlertDialog.Builder(this).setMessage(hello).show();
    }
}

class BitmapView extends View
{
    static
    {
        System.loadLibrary("nativeTest");
    }

    private native String getNewString();

    public BitmapView(Context context)
    {
        super(context);

        String hello = getNewString(); // This line throws the UnsatisfiedLinkError
        new AlertDialog.Builder(this.getContext()).setMessage(hello).show();
    }
}

カスタムビューでネイティブ関数を呼び出すにはどうすればよいですか?

私はAndroid2.2アプリとしてアプリケーションを構築しました。HTCDesireでアプリケーションを実行しています。最新のSDK(9)と最新のNDK(r5)を持っています。

4

1 に答える 1

3

あなたの問題は、それが属していないクラスからネイティブ関数を呼び出そうとしていることです。

cファイルで次のJNI関数を定義しました。

jstring Java_com_example_native_NativeTestActivity_getNewString()

これは、ロードされたときのネイティブ関数が、NativeTestActivityクラスでネイティブとして宣言されたメソッドにバインドされることを示しています。したがって、 Viewクラスから呼び出そうとすると、バインドする関数が見つかりません。

その場合、次の関数を探します(もちろん、これは.soには存在しません)。

jstring Java_com_example_native_BitmapView_getNewString()

それでも異なるクラスから同じ関数を呼び出せるようにしたい場合は、任意のクラスからアクセスできるコンテナークラスで関数を宣言できます。

例えば:

Javaコード

package com.example.native;
public class NativeHelper {
     public native String getNewString();
     static
     {
         System.loadLibrary("nativeTest");
     }
}

cコード:

jstring Java_com_example_native_NativeHelper_getNewString(JNIEnv* env, jobject javaThis)
{
     return (*env)->NewStringUTF(env, "Hello from native code!");
}
于 2010-12-22T03:49:18.423 に答える