2013-05-27 12 views
7

मैं एंड्रॉइड एनएनडी में नया हूं।ndk build and .so फ़ाइल निर्माण एंड्रॉइड

मैं एक अनुप्रयोग जो C/C++ कोड के रूप में अच्छी तरह से जावा कोड की जरूरत है

तो पर काम कर रहा हूँ, उस के लिए मैं एंड्रॉयड NDK की जरूरत है।

लेकिन मैं इस बिंदु पर अटक गया कि मैं एनएनके-बिल्ड नहीं चला सकता जो जावा और सी/सी ++ के बीच कनेक्शन बनाता है।

तो। कृपया इस समस्या को हल करने के लिए मेरी मदद करें।

मैंने विंडोज़ और लिनक्स दोनों पर कोशिश की लेकिन मुझे एक ही त्रुटि मिली।

मुझे यह त्रुटि मिली जब मैं 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 

उत्तर

21

सबसे पहले आपको यह त्रुटि मिल रही है क्योंकि आप जावा और सी/सी ++ के बीच अनुमान बनाने के लिए पैरामीटर घोषित नहीं कर रहे हैं।

तो, मैं आप अपनी समस्या के लिए मेरे कोड भेज रहा हूँ

1. सब से पहले ग्रहण में एंड्रॉयड परियोजना बनाने।

  1. प्रोजेक्ट के तहत फ़ोल्डर बनाएं -> नया क्लिक करें -> फिर फ़ोल्डर और इसे jni नाम दें।

  2. जेनी नामांकन के तहत एक और फ़ोल्डर बनाएं।

  3. जावा क्लास बनाएं। जावा वर्ग nameing- (MainActivity.java) के लिए

  4. कोड ->

    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. खुला कमांड प्रॉम्प्ट या प्रेस खिड़की + आर।

  6. निर्देशिका में स्थानांतरित करें- (कार्यक्षेत्र-> परियोजना का नाम -> jni -> शामिल)।

  7. इस निर्देशिका के तहत रन कमांड।

    javah -classpath <project-name>/bin/classes;<ANDROID_SDK_HOME>\platforms\android-<xx>\android.jar -o HelloJNI.h com.example.test.MainActivity 
    
  8. इस के बाद हम "के अंतर्गत HelloJNI.h" फ़ाइल देख सकते हैं फ़ोल्डर में शामिल हैं।

  9. जांच "HelloJNI.h" यह

    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. JNI नामकरण test.c (इस फ़ाइल test.c में पोंट 10 में यह 2 अंक का उपयोग करें)

    के तहत नई फ़ाइल बनाने के लिए इस पंक्तियाँ
    #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. एंड्रॉइड jni नामकरण के तहत नई फ़ाइल बनाएं।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. निर्देशिका-> परियोजना के लिए तो, इस आदेश को लिखना जाना आदेश में नई फ़ाइल 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. रन NDK-निर्माण शीघ्र

बनाने <android-ndk-directory>\ndk-build.cmd और

दर्ज करें इसके बाद हम जांच सकते हैं। ob obj फ़ोल्डर

  1. एनडीकेएक्टिविटी के लिए xml फ़ाइल।

    <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

धन्यवाद विक्रम, यह मेरा मुद्दा –

+0

@ विक्रम हल करता है ... जब मैं जावा-क्लासपाथ <प्रोजेक्ट-नाम>/बिन/कक्षाएं चलाने के लिए प्रयास कर रहा हूं; \ प्लेटफॉर्म \ android- \ android.jar - o HelloJNI.h com.example.test.MainActivity ...... मुझे यह अपवाद कंसोल "मुख्य" java.lang.NullPointerException \t पर sun.launcher.LauncherHelper.getMainClassFromJar (अज्ञात स्रोत) \t सूरज में यह अपवाद प्राप्त हो रहा है .launcher.LauncherHelper.checkAndLoadMain (अज्ञात स्रोत) – DJhon

+0

अच्छा जवाब! आपको धन्यवाद!!! ग्रेडल परियोजना के लिए सिर्फ एक सुधार। बिंदु 7 में हमें /bin \ classesिती <वर्ग-नाम> \ build \ intermediates \ classes \ deug (या रिलीज) – GrafOrlov

0

ऐसा लगता है कि यह .h फ़ाइल और .cpp फ़ाइल में गलत मिलान है। आपने .h फ़ाइल में फ़ंक्शंस में कुछ पैरामीटर का उल्लेख किया है जो देशी.cpp फ़ाइलों में कार्यान्वयन में अनुपलब्ध हैं।

+0

अरे कीर्ति, मैं अपने मानकों को खोज की, लेकिन खोजने में असमर्थ हूँ। उत्तर –

संबंधित मुद्दे