3

誰かがこれについて私を助けてください。

私は、ndkを使用して、Androidで階乗を実行する単純なアプリに取り組んでいます。

2つの.cppファイルが必要です。1つはクラス階乗用で、もう1つはそのクラスからメソッドを呼び出すメインになります。ビルドに関してヘッダーの問題に対処する方法がわかりません。助けてください。

#include "com_lan_factorial_FacLib.h"

JNIEXPORT jlong JNICALL Java_com_lan_factorial_FacLib_fac
  (JNIEnv *env, jclass clazz, jlong n)

{


    jlong result = (jLong) (fac(n));

    return result;
}

このコードはfacメソッドを呼び出します。これはMain.cppです

#include <stdio>
#include "com_lan_factorial_FacLib.h"

long fac(long n)
    {
        long f = 1;
        long i;
        for(i = 1; i <= n; i++)
        {
             f *= i;
        }
        return f;
    }
}

このクラスはfacメソッドを作成します。これはfac.cppです

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -Wno-psabi
LOCAL_MODULE := libfac
LOCAL_SRC_FILES := fac.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_CFLAGS := -Wno-psabi
LOCAL_MODULE := FacLib
LOCAL_SRC_FILES := Main.cpp 
LOCAL_STATIC_LIBRARIES := libfac
include $(BUILD_SHARED_LIBRARY)

コンパイルログは次のとおりです。

C:\Users\Lan\workspace\Factorial>..\..\temp\android\android-ndk-r8b\ndk-build
"Compile++ thumb : FacLib <= Main.cpp
jni/Main.cpp: In function 'jlong Java_com_lan_factorial_FacLib_fac(JNIEnv*, jclass, jlong)':
jni/Main.cpp:7:30: error: 'fac' was not declared in this scope
make: *** [obj/local/armeabi/objs/FacLib/Main.o] Error 1

facが宣言されていない理由がわかりません

4

1 に答える 1

3

2番目のファイルは本当に呼ばれていcom_lan_factorial_fac.cpp.callMainますか?.cppそれに関する問題は、拡張子がないことです。その拡張子はcallMainです。で終わる名前に名前を.cpp変更し、Anrdoid.mkを編集して両方のファイル名を一覧表示します。

LOCAL_SRC_FILES := com_lan_factorial_callMain.cpp some_other_file_name.cpp

すべてのファイルを1行にリストすることも、次のように分割することもできます。

LOCAL_SRC_FILES := com_lan_factorial_callMain.cpp \
    some_other_file_name.cpp

もう1つのエラーメッセージは、ファイルcom_lan_factorial_fac.hが見つからないことです。そのようなファイルは存在しますか?

編集:あなたのAndroid.mkは間違っています。2つのライブラリを構築しているのではなく、2つのソースファイルから1つを構築しています。次のようになります。

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_CFLAGS := -Wno-psabi 

LOCAL_MODULE := libfac 

LOCAL_SRC_FILES := fac.cpp Main.cpp

include $(BUILD_STATIC_LIBRARY) 

また、Main.cppでfac()、#include行とJava_com_lan_factorial_FacLib_fac関数の間に呼び出された関数が存在することを宣言する必要があります。

extern long fac(long n);

コンパイルエラーメッセージは、この行がないことに関係しています。

LOCAL_C_INCLUDES行は通常必要ありません。

ちなみに、組み込みのCデータ型longとAndroidJNIjlongで定義されているものは同じではありません。fac()を使用するように書き直してくださいjlong

于 2012-10-10T23:52:35.983 に答える