7

私はアンドロイドndkが初めてです。

私はJavaコードとc/c++コードを必要とするアプリに取り組んでいます

そのためには、Android ndkが必要です。

しかし、この時点で、java と c/c++ を接続する ndk-build を実行できないことに固執しました。

そう。誰かがこの問題を解決するために私を助けてください。

Windowsと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 
4

2 に答える 2

21

まず第一に、パラメータを宣言していないため、このエラーが発生しています。これは、java と c/c++ の間の接続を作成する必要があります。

だから、私はあなたの問題のための私のコードを送ります

1.まず、Eclipse で Android プロジェクトを作成します。

  1. プロジェクトの下にフォルダを作成 -> 新規をクリック -> 次にフォルダをクリックし、jni という名前を付けます。

  2. jni 命名 include の下にもう 1 つのフォルダーを作成します。

  3. Java クラスを作成します。

  4. Javaクラスの命名コード - (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. コマンド プロンプトを開くか、window+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. この後、include フォルダーの下に「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 の pont 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. Android.mk という名前の jni の下に新しいファイルを作成します

    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-build を実行します。

プロジェクトディレクトリに移動->次に、このコマンド<android-ndk-directory>\ndk-build.cmdを記述してEnterキーを押します

この後、obj フォルダーの下の .so ファイルを確認できます

  1. NDKActivity の 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>
    
于 2013-05-27T10:57:32.817 に答える
-1

これは .h ファイルと .cpp ファイルの関数の不一致のようです。native.cpp ファイルの実装で欠落している .h ファイルの関数のいくつかのパラメーターについて言及しました。

于 2013-05-27T10:34:44.117 に答える