2013-05-27 8 views
7

sono nuovo in Android ndk.ndk build e creazione del file .so android

Sto lavorando su un'applicazione che ha bisogno di codice Java e codice C/C++

Quindi, per questo ho bisogno NDK Android.

Ma mi sono bloccato a questo punto che non posso eseguire ndk-build che rende la connessione tra java e c/C++.

Così. per favore qualcuno mi aiuti a risolvere questo problema.

Ho provato su Windows e Linux ma ho ottenuto lo stesso errore.

Ho ricevuto questo errore quando uso 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 

risposta

21

Prima di tutto si ottiene questo errore perché non si sta dichiarando il parametro in è necessario creare la connessione tra java e c/C++.

così, io vi mando il mio codice per il vostro problema

1.First di tutto creare progetto Android in Eclipse.

  1. creare cartella in progetto fare clic -> fare clic nuovo -> quindi cartella e denominarlo jni.

  2. creare un'altra cartella con nome jni include.

  3. creare classe java.

  4. codice per la classe 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. prompt dei comandi di apertura o premere finestra + R.

  6. passare a directory- (spazio di lavoro-> nome progetto -> jni -> include).

  7. eseguire il comando in questa directory.

    javah -classpath <project-name>/bin/classes;<ANDROID_SDK_HOME>\platforms\android-<xx>\android.jar -o HelloJNI.h com.example.test.MainActivity 
    
  8. dopo questo possiamo vedere file "HelloJNI.h" sotto includono cartella.

  9. controllo "HelloJNI.h" Abbiate in linee in esso

    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. creare un nuovo file con JNI denominazione test.c (utilizzare questi 2 punti in 10 pont in questo file 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. creare un nuovo file con nome jni 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. creare un nuovo file 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 al comando promt

Vai al progetto DIRECTORY> allora, scrivere questo comando <android-ndk-directory>\ndk-build.cmd e premere invio

dopo questo possiamo controllare .so file u nder obj folder

  1. file xml per 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

grazie Vikram, ha risolto il mio problema –

+0

@Vikram ... quando sto cercando di eseguire javah -classpath /bin/classi; \ piattaforme \ android- \ android.jar - o HelloJNI.h com.example.test.MainActivity ...... Ricevo questa eccezione nella console "main" java.lang.NullPointerException \t a sun.launcher.LauncherHelper.getMainClassFromJar (sorgente sconosciuta) \t at sun .launcher.LauncherHelper.checkAndLoadMain (fonte sconosciuta) – DJhon

+0

bella risposta! grazie amico!!! una sola correzione per il progetto gradle. al punto 7 dovremmo sostituire /bin/classi con \ build \ intermediates \ classes \ debug (o release) – GrafOrlov

0

Sembra che questa sia una funzione errata nel file .h e nel file .cpp. Hai menzionato alcuni parametri in funzioni nel file .h che mancano all'implementazione nei file native.cpp.

+0

Hey Kirti, ho cercato i miei parametri, ma m in grado di trovare. Grazie per la risposta –