2013-05-27 11 views
7

ich bin neu in android ndk.ndk build and .so file creation android

ich auf einer App arbeite, die Java-Code als auch C/C++ Code

So muss, denn das brauche ich Android NDK.

Aber ich steckte an diesem Punkt, dass ich nicht ausführen kann ndk-build, die die Verbindung zwischen Java und C/C++ macht.

So. Bitte helfen Sie mir, dieses Problem zu lösen.

Ich habe versucht, beide Windows und Linux, aber den gleichen Fehler.

Ich habe diesen Fehler, wenn ich ndk-build benutze.

/home/kamal/android-ndk-r8e/build/core/add-application.mk:128: Android NDK:  
Compile thumb : ndk <= native.c 
jni/native.c: In function 'Java_com_example_demo_MainActivity_hello': 
jni/native.c:4:3: error: parameter name omitted 
jni/native.c:4:3: error: parameter name omitted 
jni/native.c:5:10: error: 'env' undeclared (first use in this function) 
jni/native.c:5:10: note: each undeclared identifier is reported only once for each    function it appears in 
jni/native.c: In function 'Java_com_example_demo_MainActivity_add': 
jni/native.c:9:3: error: parameter name omitted 
jni/native.c:9:3: error: parameter name omitted 
jni/native.c:9:3: error: parameter name omitted 
jni/native.c:9:3: error: parameter name omitted 
jni/native.c:10:9: error: 'value1' undeclared (first use in this function) 
jni/native.c:10:18: error: 'value2' undeclared (first use in this function) 
make: *** [obj/local/armeabi/objs/myjni/native.o] Error 1 

Antwort

21

Zunächst bekommen Sie diesen Fehler, weil Sie nicht deklarieren Parameter in ist, um Verbindung zwischen Java und C/C++ zu erstellen.

SO sende ich Ihnen meinen Code für Ihr Problem

1.First aller Android-Projekt in Eclipse erstellen.

  1. erstellen Ordner unter Projekt klicken -> klicken Sie auf neu -> dann Ordner und nennen Sie es jni.

  2. erstellen Sie einen weiteren Ordner unter jni naming Include.

  3. Java-Klasse erstellen.

  4. Code für Java-Klasse nameing- (MainActivity.java) ->

    package com.example.ndk; 
    
    import android.os.Bundle; 
    import android.app.Activity; 
    import android.view.Menu; 
    
    public class MainActivity extends Activity { 
    
    static { 
        System.loadLibrary("myjni"); 
        } 
    
    /** 
    * Adds two integers, returning their sum 
    */ 
    public native int add(int v1, int v2); 
    
    /** 
    * Returns Hello World string 
    */ 
    public native String hello(); 
    
    
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
    } 
    
        } 
    
  5. offene Eingabeaufforderung oder drücken Fenster + R.

  6. Verschieben in Verzeichnis- (Arbeitsbereich-> Projektname -> Jni -> include).

  7. Befehl unter diesem Verzeichnis ausführen.

    javah -classpath <project-name>/bin/classes;<ANDROID_SDK_HOME>\platforms\android-<xx>\android.jar -o HelloJNI.h com.example.test.MainActivity 
    
  8. danach können wir "HelloJNI.h" Datei unter include Ordner.

  9. check "HelloJNI.h" hat diese Zeilen in ihm

    JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_add(JNIEnv *, jobject, jint, jint); 
    
    JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_hello (JNIEnv *, jobject); 
    
  10. neue Datei unter jni Namensgebung test.c erstellen (Verwenden Sie diese 2 Punkte in pont 10 in dieser Datei test.c)

    #include <jni.h> 
        #include "include/HelloJNI.h" 
    
    JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_hello 
        (JNIEnv *env, jobject javaThis) { 
        return (*env)->NewStringUTF(env, "Hello"); 
    } 
    
        JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_add 
         (JNIEnv *env, jobject javaThis, jint value1, jint value2){ 
    return (value1 + value2); 
        } 
    
  11. Erstellen Sie eine neue Datei unter jni namens Android.mk

    LOCAL_PATH := $(call my-dir) 
    
    include $(CLEAR_VARS) 
    
    LOCAL_MODULE := myjni  // from point 5 
    LOCAL_SRC_FILES := test.c  //from point 10 that we creare test.c 
    
    include $(BUILD_SHARED_LIBRARY) 
    
  12. neue Datei NDKActivity.java

    package com.example.ndk; 
    
        import android.app.Activity; 
        import android.view.View.OnClickListener; 
        import android.os.Bundle; 
        import android.view.View; 
        import android.widget.Button; 
        import android.widget.EditText; 
        import android.widget.TextView; 
    
        public class NDKActivity extends Activity{ 
    
        Button buttonCalc; 
        TextView result; 
        EditText value1,value2; 
        /** Called when the activity is first created. */ 
        MainActivity nativeLib; 
        public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    nativeLib = new MainActivity(); 
        String helloText = nativeLib.hello(); 
    
    result = (TextView) findViewById(R.id.result); 
    value1 = (EditText) findViewById(R.id.value1); 
    value2 = (EditText) findViewById(R.id.value2); 
    
    // Update the UI 
    TextView outText = (TextView) findViewById(R.id.textOut); 
    outText.setText(helloText); 
    
    // Setup the UI 
    buttonCalc = (Button)this.findViewById(R.id.buttonCalc); 
    
    buttonCalc.setOnClickListener(new OnClickListener() { 
    
    
    public void onClick(View v) { 
    int v1, v2, res = -1; 
    v1 = Integer.parseInt(value1.getText().toString().trim()); 
    v2 = Integer.parseInt(value2.getText().toString().trim()); 
    
    res = nativeLib.add(v1, v2); 
    result.setText(new Integer(res).toString()); 
    } 
    
    
    
    }); 
    } 
        } 
    
  13. laufen NDK-build in Befehl promt

gehen zu projizieren Verzeichnis-> dann schreiben Sie diesen Befehl create <android-ndk-directory>\ndk-build.cmd und drücken Sie Enter

danach können wir überprüfen .so Datei u nder obj-Ordner

  1. XML-Datei für NDKActivity.

    <TextView android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Vikram" 
    android:textSize="22sp"/> 
    <TextView android:id="@+id/textOut" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Output"/> 
    
    <EditText 
    android:id="@+id/value1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:hint="Value 1" 
    android:inputType="numberDecimal" /> 
    
    <TextView android:id="@+id/TextView01" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="+" 
        android:textSize="36sp" /> 
    
         <EditText 
        android:id="@+id/value2" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Value 2" 
        android:inputType="numberDecimal" /> 
    
    <Button android:id="@+id/buttonCalc" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="=" /> 
    <TextView android:id="@+id/result" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="result" 
        android:textSize="36sp" /> 
    
    
        </LinearLayout> 
    
+0

Dank Vikram, löste es mein Problem –

+0

@Vikram ... wenn ich versuche, Java-Klasse-Pfad /bin/Klassen; \ Plattformen \ Android- \ android.jar - o HelloJNI.h com.example.test.MainActivity ...... ich erhalte diese Ausnahme in der Konsole "main" java.lang.NullPointerException \t bei sun.launcher.LauncherHelper.getMainClassFromJar (Unknown Source) \t bei Sonne .launcher.LauncherHelper.checkAndLoadMain (Unbekannte Quelle) – DJhon

+0

nette Antwort! Danke mann!!! nur eine Korrektur für das Großprojekt. Nummer 7 wir substitude /bin/Klassen mit sollte \ bauen \ Intermediate \ classes \ debug (oder Freigabe) – GrafOrlov

0

Es scheint zu sein, dass diese Funktion in der .h-Datei und in der .cpp-Datei nicht übereinstimmt. Sie haben einige Parameter in Funktionen in der .h-Datei erwähnt, die bei der Implementierung in native.cpp-Dateien fehlen.

+0

Hey Kirti, suchte ich meine Parameter aber bin finden nicht in der Lage. Danke für die Antwort –