将本机C文件作为库添加到Android项目

将本机C文件作为库添加到Android项目,android,android-ndk,shared-libraries,native-code,android-library,Android,Android Ndk,Shared Libraries,Native Code,Android Library,我要创建一个Android应用程序,它可以执行加法、减法、乘法、除法等算术功能 我知道这是一个简单的应用程序,但为了使它有点复杂,我用C编写了它,它被称为“arithmetricoperations.C” 现在,我想将这个.c文件作为库包含到我的Android项目中 我试过: 使用androidndk,它可以工作,但我必须向用户提供代码 我分别使用Android NDK创建了一个.so文件,并将其包含在测试应用程序的libs/armeabi文件夹中;并显示不满意链接错误异常 使用androidn

我要创建一个Android应用程序,它可以执行加法、减法、乘法、除法等算术功能

我知道这是一个简单的应用程序,但为了使它有点复杂,我用C编写了它,它被称为“arithmetricoperations.C”

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

我试过:

  • 使用androidndk,它可以工作,但我必须向用户提供代码
  • 我分别使用Android NDK创建了一个.so文件,并将其包含在测试应用程序的libs/armeabi文件夹中;并显示不满意链接错误异常
  • 使用androidndk,我构建了一个简单的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);
    }
    
    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的库

    这也可以看作是

  • 将.so文件添加到Android项目
  • 将包含.so文件的jar文件添加到Android项目
  • 我分别使用android NDK创建了一个.so文件,并包含在测试应用程序的libs/armeabi文件夹中;并且它显示了不满意的linkerror异常

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

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


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

    您是否尝试过查看Android NDK附带的示例/hello jni示例?@MārtiņšMožeiko,+1用于提及示例,它们非常有用…@MārtiņšMo eiko我已经尝试过提及的示例。成功了。问题是我想分发我的图书馆,而不是我的资料来源。NDk要求源代码被分发。我在问题中添加了更多的代码,请参考任何试图回答这个问题的人,当OP指的是“用户”时,OP并不意味着“用户”。OP的意思是“开发者”。你是如何构建.so文件的??是通过安卓NDK。我对jni不太了解。如果你推荐一个好的示例应用程序会更好。NDK中samples目录下的hello-jni示例是非常好的起点。看一看。还可以阅读docs目录下的NDK文档。
    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);
    }