0

Ich bin eine Android-Anwendung erstellen, die die arithmetischen Funktionen wie Addition, Subtraktion, Multiplikation, Division durchführt.Android-Bibliothek/Hinzufügen einer nativen C-Datei als Bibliothek zu Android-Projekt

ich seine eine einfache Anwendung kennen, aber es ein wenig kompliziert zu machen, ich habe es in C geschrieben (dh) ArithmeticOperations.c

Nun, da ich diese C-Datei als ein einschließen möchte Bibliothek zu meinem Android-Projekt.

versuchte ich

  1. mit Android NDK, seine gearbeitet, aber ich habe den Code für den Benutzer zur Verfügung zu stellen
  2. i eine .so-Datei separat Android NDK mit erstellt und in den libs/armeabi enthalten Ordner der Testanwendung; und es zeigte Unatiefiedlinkerror Ausnahme
  3. mit Android NDK, baute ich ein einfaches Android-Projekt und in Jar, so dass es in andere Anwendung importiert werden kann, und es hat nicht funktioniert auch.

Bitte helfen Sie mir, dass ich diese C-Datei als Bibliothek zu einem Android-Projekt zur Verfügung stellen kann

**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); 
} 

Nun, da ich diese c-Datei als Bibliothek will auch

kann dies auf Android betrachtet werden, in wie 1. Hinzufügen .so Datei zu android Projekt 2. eine jAR-Datei hinzufügen, die eine .so-Datei auf einem android-Projekt enthält

+1

Haben Sie versucht, Proben/Hallo-jni Beispiel, das mit Android NDK kommt? –

+0

@ MārtiņšMožeiko, +1 für die Nennung von Proben, sie sind wirklich hilfreich ... – aProgrammer

+0

@ MārtiņšMožeiko Ich habe das erwähnte Beispiel ausprobiert. es funktionierte. Sache ist, dass ich meine Bibliothek und nicht meine Quelle verteilen möchte. NDk erfordert, dass die Quelle verteilt wird. – Britto

Antwort

2

Ich habe eine .so-Datei mit Android NDK separat erstellt und im libs/armeabi-Ordner der Testanwendung enthalten; und es zeigte Unatiefiedlinkerror Exception

Haben Sie die Bibliothek mit system.loadLibrary() geladen? Sie sollten es innerhalb des "statischen" Teils Ihrer Klasse tun, siehe zum Beispiel this.

+0

Entschuldigung, das funktioniert nicht. es gibt unzufriedener Linkfehler Add. – Britto

+0

Ich habe mehr Code zu der Frage hinzugefügt, bitte verweisen Sie – Britto

0

Shared Library (.so Datei) unter libs/armeabi Ordner setzen und richtig aufrufen System.loadLibrary (...) sollte funktionieren. Keine Notwendigkeit, Quelle zu verteilen.

Überprüfen Sie, dass die .so-Datei sich wirklich in der .apk-Datei befindet (es handelt sich um eine ZIP-Datei) und vergewissern Sie sich, dass Sie loadLibrary mit dem korrekten Namen aufrufen.

+0

wie haben Sie die .so Datei ?? ist es durch android NDK. Ich habe keine gute Idee über jni. es wäre besser, wenn Sie eine gute Beispielanwendung vorschlagen. – Britto

+1

hallo-jni Beispiel unter Samples-Verzeichnis in NDK ist sehr guter Ausgangspunkt. Schau es dir an. Lesen Sie auch die NDK-Dokumentation im docs-Verzeichnis. –