2013-05-27 12 views
7

Jestem nowy w Androidie ndk.ndk kompilacja i tworzenie plików .so android

Pracuję w aplikacji, która potrzebuje kodu java oraz C/C++ kod

Tak więc, na które muszę Android NDK.

Ale utknąłem w tym miejscu, że nie mogę uruchomić ndk-build, która tworzy połączenie między java i c/C++.

So. proszę, pomóż mi rozwiązać ten problem.

Próbowałem w obu systemach Windows i Linux, ale dostałem ten sam błąd.

Mam ten błąd, gdy używam ndk-build.

/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 

Odpowiedz

21

Przede wszystkim otrzymujesz ten błąd, ponieważ nie deklarujesz parametru w należy utworzyć połączenie między java i c/C++.

Jestem więc przesyłam Ci mój kod dla swojego problemu

1.First wszystkim tworzyć android projektu w Eclipse.

  1. utwórz folder pod projektem kliknij -> kliknij nowy -> następnie folder i nadaj mu nazwę jni.

  2. utworzyć jeszcze jeden folder pod nazwą jni include.

  3. utwórz klasę Java. Kod

  4. do klasy Java 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. otwarty wiersz polecenia lub okna wciśnij + R.

  6. przejdź do katalogu- (obszar roboczy-> nazwa projektu -> jni -> uwzględnij).

  7. Uruchom komendę w tym katalogu.

    javah -classpath <project-name>/bin/classes;<ANDROID_SDK_HOME>\platforms\android-<xx>\android.jar -o HelloJNI.h com.example.test.MainActivity 
    
  8. po tym możemy zobaczyć plik "HelloJNI.h" w folderze zawarcia.

  9. wyboru "HelloJNI.h" ma to linie w nim

    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. utworzyć nowy plik pod test.c JNI nazewnictwa (to wykorzystać 2 punkty w Pont 10, w tym plików 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. utwórz nowy plik pod nazwą jni na Androida.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. Utwórz nowy plik 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. run NDK-build w komendzie PROMT

iść do projektu directory-> wtedy, pisać i to polecenie <android-ndk-directory>\ndk-build.cmd wciśnij enter

po tym możemy sprawdzić .so plik u nder obj folder

  1. plik xml dla 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

dzięki Vikram, to rozwiązało mój problem –

+0

@Vikram ... kiedy próbuję uruchomić javah -classpath /bin/classes; \ platforms \ android- \ android.jar - o HelloJNI.h com.example.test.MainActivity ...... Otrzymuję ten wyjątek w konsoli "main" java.lang.NullPointerException \t w sun.launcher.LauncherHelper.getMainClassFromJar (Nieznane źródło) \t w słońcu .launcher.LauncherHelper.checkAndLoadMain (Nieznane źródło) – DJhon

+0

dobra odpowiedź! Dziękuje!!! tylko jedna korekta dla projektu gradle. w punkcie 7 powinniśmy zastąpić /bin/classes przez \ build \ intermediates \ classes \ debug (lub wydanie) – GrafOrlov

0

Wygląda na to, że jest to funkcja niezgodna w pliku .h i .cpp. Wymieniłeś niektóre parametry funkcji w pliku .h, których brakuje w implementacji w plikach native.cpp.

+0

Hej Kirti, szukałem moje parametry, ale jestem w stanie znaleźć. Dziękuję za odpowiedź –

Powiązane problemy