0

足し算、引き算、掛け算、割り算などの算術関数を実行する Android アプリケーションを作成します。

これが単純なアプリケーションであることはわかっていますが、少し複雑にするために、「ArithmeticOperations.c」と呼ばれる C で記述しました。

この .c ファイルをライブラリとして Android プロジェクトに含めたいと思います。

私は試した:

  1. Android NDKを使用するとうまくいきましたが、ユーザーにコードを提供する必要があります
  2. Android NDK を使用して .so ファイルを個別に作成し、テスト アプリケーションのlibs/armeabiフォルダーに含めました。Unsatisfiedlinkerror Exception が表示されまし
  3. Android NDKを使用して、単純なAndroidプロジェクトを構築し、jarに変換して、他のアプリケーションにインポートできるようにしましたが、機能しませんでした。

この .c ファイルをライブラリとして Android プロジェクトに提供するにはどうすればよいですか?

first.c

int add(int x, int y)
{
return x+y;
}

int sub(int x, int y)
{
return x-y;
}

int mul(int x, int y)
{
return x*y;
}

int div(int x, int y)
{
    return x/y;
}

**second.c**

#include "first.h"
#include <jni.h>

jint
Java_bri_ndk_sample_ArithmeticOperations_add( JNIEnv*  env,
                                  jobject  this,
                                  jint     x,
                                  jint     y )
{
return add(x, y);
}

jint
Java_bri_ndk_sample_ArithmeticOperations_sub( JNIEnv*  env,
                                  jobject  this,
                                  jint     x,
                                  jint     y )
{
return sub(x, y);
}


jint
Java_bri_ndk_sample_ArithmeticOperations_mul( JNIEnv*  env,
                                  jobject  this,
                                  jint     x,
                                  jint     y )
{
return mul(x, y);
}


jint
Java_bri_ndk_sample_ArithmeticOperations_div( JNIEnv*  env,
                                  jobject  this,
                                  jint     x,
                                  jint     y )
{
 return div(x, y);
}

最初の.h

extern int add(int  x, int  y);
extern int mul(int  x, int  y);
extern int sub(int  x, int  y);
extern int div(int  x, int  y);

Android アクティビティ

package bri.sample;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class SampleTestActivity extends Activity {
/** Called when the activity is first created. */
static{
     try{
            System.loadLibrary("twolib-second");
     }catch (Exception e){
            e.printStackTrace();
     }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);



    final EditText xVal = (EditText)findViewById(R.id.editText1);
    final EditText yVal = (EditText)findViewById(R.id.editText2);
    final TextView result = (TextView)findViewById(R.id.textView1);
    //final Arithmetic al = new Arithmetic();

    Button b1 = (Button) findViewById(R.id.button1);
    b1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            int x = Integer.parseInt(xVal.getText().toString());
            int y = Integer.parseInt(yVal.getText().toString());
            Integer z = add(x, y);
            result.setText(z.toString());
        }
    });

    Button sub = (Button) findViewById(R.id.button2);
    sub.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            int x = Integer.parseInt(xVal.getText().toString());
            int y = Integer.parseInt(yVal.getText().toString());
            Integer z = sub(x, y);
            result.setText(z.toString());
        }
    });

    Button mul = (Button) findViewById(R.id.button3);
    mul.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            int x = Integer.parseInt(xVal.getText().toString());
            int y = Integer.parseInt(yVal.getText().toString());
            Integer z = mul(x, y);
            result.setText(z.toString());
        }
    });

    Button div = (Button) findViewById(R.id.button4);
    div.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            int x = Integer.parseInt(xVal.getText().toString());
            int y = Integer.parseInt(yVal.getText().toString());
            Integer z = div(x, y);
            result.setText(z.toString());
        }
    });

}

public native int add(int  x, int  y);
public native int sub(int  x, int  y);
public native int mul(int  x, int  y);
public native int div(int  x, int  y);
}

この C ファイルを Android のライブラリとして使用したいので、

これは次のように調べることもできます

  1. .so ファイルを Android プロジェクトに追加する
  2. .so ファイルを含む jar ファイルを Android プロジェクトに追加する
4

2 に答える 2

2

Android NDK を個別に使用して .so ファイルを作成し、テスト アプリケーションの libs/armeabi フォルダーに含めました。Unsatisfiedlinkerror Exception が表示されました

system.loadLibrary() を使用してライブラリをロードしましたか? クラスの「静的」部分内で行う必要があります。たとえば、 thisを参照してください。

于 2012-03-28T16:20:25.290 に答える
0

libs/armeabi フォルダーの下に共有ライブラリ (.so ファイル) を置き、正しく System.loadLibrary(...) を呼び出すと、正常に動作するはずです。ソースを配布する必要はありません。

.so ファイルが実際に .apk ファイル (zip ファイル) に含まれていることを確認し、正しい名前で loadLibrary を呼び出していることを確認します。

于 2012-03-30T21:35:40.947 に答える