2013-05-27 3 views
7

Я новичок в android ndk.ndk build and .so создание файла android

Я работаю на приложение, которое нуждается в Java-код, а также с кодом/C++

Так, что я нужен андроид NDK.

Но я застрял в этой точке, что я не могу запустить ndk-build, что делает связь между java и c/C++.

So. пожалуйста, помогите мне решить эту проблему.

Я пробовал оба окна и Linux, но получил такую ​​же ошибку.

У меня возникла эта ошибка, когда я использую 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

Прежде всего, вы получаете эту ошибку, потому что вы не объявляете параметр в обязательном порядке, чтобы создать связь между java и c/C++.

SO, я посылаю вам мой код для вашей проблемы

1.First всего создать андроид проект в затмении.

  1. создать папку под кликом проекта -> кликнуть на новую -> затем папку и назовите ее jni.

  2. создать еще одну папку под именем jni.

  3. создать класс java.

  4. код класса 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. открытой командной строке или нажмите окно + R.

  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 (используются 2 очка в Понте 10 в этом файле 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. создать новый файл под именем jni, назвав Android.тк

    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. выполнения НДК-строить в команде ПРОМТ

перейти к проекту СПРАВОЧНИК> затем, написать эту команду <android-ndk-directory>\ndk-build.cmd и хит ввод

после этого мы можем проверить .so файл u nder obj folder

  1. xml файл для 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

спасибо Vikram, он решил мою проблему –

+0

@Vikram ... когда я пытаюсь запустить javah -classpath <имя-проекта>/bin/classes; \ platform \ android- \ android.jar - o HelloJNI.h com.example.test.MainActivity ...... Я получаю это исключение в консоли «main» java.lang.NullPointerException \t на sun.launcher.LauncherHelper.getMainClassFromJar (Неизвестный источник) \t на солнце .launcher.LauncherHelper.checkAndLoadMain (Неизвестный источник) – DJhon

+0

хороший ответ! Спасибо, мужик!!! только одна поправка для проекта градиента. в пункте 7 мы должны подстроить /bin/classes с помощью \ build \ intermediates \ classes \ debug (или release) – GrafOrlov

0

Похоже, что это функция неправильного совпадения в файле .h и .cpp. Вы упомянули некоторые параметры в функциях в файле .h, которые отсутствуют в реализации в файлах native.cpp.

+0

Эй Kirti, я искал мои параметры, но м не удалось найти. Thanx for reply –

Смежные вопросы