0

我要創建一個Android應用程序,執行加法,減法,乘法,除法等算術函數。Android庫/添加一個本地C文件作爲庫到Android項目

我知道它的一個簡單的應用程序,但要使它有點複雜,我在C. (IE)ArithmeticOperations.c寫它現在

,我想包括這個.c文件作爲到我的android項目。

我試圖

  1. 採用了android NDK,它的工作,但我必須提供的代碼
  2. 我分別使用的Android NDK創建的.so文件的用戶,並列入庫/ armeabi測試應用程序的文件夾;它顯示Unsatisfiedlinkerror異常
  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); 
} 

**first.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 Activity** 

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項目中

+1

您是否嘗試過查看Android NDK附帶的samples/hello-jni示例? – 2012-03-28 14:57:21

+0

@MārtiņšMožeiko,提供樣品+1,他們真的有幫助... – aProgrammer 2012-03-29 05:37:57

+0

@MārtiņšMožeiko我已經嘗試過提到的樣品。有效。事情是我想分發我的圖書館,而不是我的來源。 NDk要求源碼分發。 – Britto 2012-03-29 05:48:29

回答

2

我使用android NDK單獨創建了一個.so文件,並將其包含在測試應用程序的libs/armeabi文件夾中;並且它顯示Unsatisfiedlinkerror異常

您是否使用system.loadLibrary()加載庫?你應該在班級的「靜態」部分進行,例如參見this

+0

對不起,不工作。它給出了不滿意的錯誤添加。 – Britto 2012-03-29 05:46:59

+0

我已經添加更多代碼的問題請參考 – Britto 2012-03-29 06:02:31

0

將共享庫(.so文件)放在libs/armeabi文件夾下並正確調用System.loadLibrary(...)應該可以正常工作。無需分發源代碼。

確認.so文件確實存在於.apk文件(它是一個zip文件)中,並驗證您是否使用正確的名稱調用loadLibrary。

+0

你是如何建立.so文件?它是通過android NDK。我對jni沒有好的想法。如果你建議一個好的示例應用程序會更好。 – Britto 2012-04-02 06:03:59

+1

hello-jni例子下的NDK樣本目錄是非常好的起點。看看它。另請閱讀docs目錄下的NDK文檔。 – 2012-04-02 07:54:44

相關問題