0

こんにちは、Ivgot は gnu make buldier Cros GCC を設定し、javah は cygwin で作成しました。ヘッダファイル。そして、同じ jni ディレクトリに .h と .cpp があります: このエラーで理解できません:

        make all 
     Building file: ../jni/com_jp_algi_CoreC.cpp
  Invoking: Cross G++ Compiler
     g++ -I"C:\android-ndk-r5c\platforms\android-9\arch-arm\usr\include" -O0 -g3 -           Wall -c -fmessage-length=0 -MMD -MP -MF"jni/com_jp_algi_CoreC.d" -                MT"jni/com_jp_algi_CoreC.d" -o "jni/com_jp_algi_CoreC.o" "../jni/com_jp_algi_CoreC.cpp"
         ../jni/com_jp_algi_CoreC.cpp:2:31: fatal error: com_jp_algi_CoreC.h: No such            file or        directory
   jni/subdir.mk:18: recipe for target `jni/com_jp_algi_CoreC.o' failed
   compilation terminated.
    make: *** [jni/com_jp_algi_CoreC.o] Error 1

Android buldier は動作しますが、このエラーは実装されていません。cygwin で javah を使用して .h を作成するときに、I thnik 外部 make を使用する必要があります...おそらく、この Java プロジェクトを C++-add nature に変換します..問題が発生するでしょうか?

この .mk を Ivgot:

    LOCAL_PATH := $(call my-dir)

   include $(CLEAR_VARS)

  LOCAL_MODULE    := com_jp_algi_CoreC
LOCAL_SRC_FILES := com_jp_algi_CoreC.cpp

   include $(BUILD_SHARED_LIBRARY)

.cpp:

 #include <com_jp_algi_CoreC.h>
    /* Header for class com_jp_algi_CoreC */


  extern "C" {

  JNIEXPORT void JNICALL Java_com_jp_algi_CoreC_vector
 (JNIEnv *env, jobject clazz, jfloatArray input){
jfloat* flt1=NULL ;
jsize size = env->GetArrayLength(input);
jint i;
// check if array size >0 and wedont cause exception


// allocate buffer for array and get data from Java array
flt1  = new jfloat[size];
env->GetFloatArrayRegion(input,0,size,flt1);
// exception check. Always use exception check

// do stuff to the array

for (i = 0 ; i < size; i++){
    flt1[i] = 1;
}



// vector(flt1);
// set result to Java array and delete buffer. And exception check of course
env->SetFloatArrayRegion(input,0,size,flt1);
delete[] flt1;

// All is ok

  }


 JNIEXPORT void JNICALL Java_com_jp_algi_CoreC_vector2
  (JNIEnv *, jobject, jfloatArray, jobjectArray);


   }

.h: /* このファイルは編集しないでください - これは機械で生成されたものです/ #include /クラス com_jp_algi_CoreC のヘッダー */

      #ifndef _Included_com_jp_algi_CoreC
      #define _Included_com_jp_algi_CoreC
    #ifdef __cplusplus
    extern "C" {
       #endif
    /*
  * Class:     com_jp_algi_CoreC
 * Method:    vector
 * Signature: ([F)V
    */
  JNIEXPORT void JNICALL Java_com_jp_algi_CoreC_vector
    (JNIEnv *, jobject, jfloatArray);

      /*
     * Class:     com_jp_algi_CoreC
   * Method:    vector2
    * Signature: ([F[[F)V
        */
JNIEXPORT void JNICALL Java_com_jp_algi_CoreC_vector2
   (JNIEnv *, jobject, jfloatArray, jobjectArray);

   #ifdef __cplusplus
  }
 #endif
    #endif

そしてこのCoreCクラス:

   package com.jp.algi;

  public class CoreC {
        static {
    System.loadLibrary("com_jp_algi_CoreC");
    }

public native void vector(float[] input);

public native void vector2(float[] input, float[][] input2);

      }
4

2 に答える 2

0

あなたのNDKはかなり古いです。新しいバージョンには多くの改善とバグ修正があります。今日の最新のものはr8dで、cygwinがなくてもWindowsで動作します。

コードに関しては、その#includeステートメントはまったく必要ありません。.cppファイルの最初の行を削除するだけで、正しくコンパイルおよびリンクされます。

于 2013-01-25T21:46:24.013 に答える
0

「com_jp_algi_CoreC.cpp」ファイル内に「com_jp_algi_CoreC.h」ファイルが含まれていますか?

Android.mk ファイルは次のようになっていますか?

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := module_name
LOCAL_SRC_FILES := com_jp_algi_CoreC.cpp

include $(BUILD_SHARED_LIBRARY)

Android プロジェクト内のディレクトリ構造は次のようになっていますか?

jni/
├── Android.mk
├── com_jp_algi_CoreC.h
├── com_jp_algi_CoreC.cpp

また、Eclipse の代わりにプロジェクトのルートからndk-buildを実行してみて、違いがあるかどうかを確認してください。

編集:コードを使用して、テスト Android アプリケーションを作成し、 ndk-buildでネイティブ コードをコンパイルしましたが、 すべて正常に動作します。

于 2013-01-25T14:49:31.767 に答える