0

我要创建一个执行算术功能的 Android 应用程序,例如加法、减法、乘法、除法。

我知道这是一个简单的应用程序,但为了让它有点复杂,我用 C 语言编写了它,它被称为“ArithmeticOperations.c”。

现在我想将此 .c 文件作为库包含到我的 Android 项目中。

我试过了:

  1. 使用 Android NDK,它可以工作,但我必须向用户提供代码
  2. 我使用 Android NDK 单独创建了一个 .so 文件,并包含在测试应用程序的libs/armeabi文件夹中;它显示Unsatisfiedlinkerror异常
  3. 使用android NDK,我构建了一个简单的android项目并转换为jar,以便可以将其导入其他应用程序,但它也不起作用。

如何将此 .c 文件作为库提供给 Android 项目?

第一个.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);

安卓活动

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 异常

您是否使用 system.loadLibrary() 加载了库?您应该在类的“静态”部分中执行此操作,例如参见this

于 2012-03-28T16:20:25.290 回答
0

将共享库(.so 文件)放在 libs/armeabi 文件夹下并正确调用 System.loadLibrary(...) 应该可以正常工作。无需分发源代码。

验证 .so 文件是否真的在 .apk 文件中(它是一个 zip 文件),并验证您正在使用正确的名称调用 loadLibrary。

于 2012-03-30T21:35:40.947 回答