3

请有人帮助我。

我正在开发一个简单的应用程序,使用 ndk 在 android 上进行阶乘。

我想要 2 个 .cpp 文件,一个用于类阶乘,一个是从该类调用方法的主要文件。在构建时我不知道如何处理标题问题,请帮助。

#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

你的第二个文件真的被调用了com_lan_factorial_fac.cpp.callMain吗?它的问题是没有.cpp扩展名。它的扩展名是callMain. 重命名为以 结尾的.cpp名称,然后编辑您的 Anrdoid.mk 以列出两个文件名:

LOCAL_SRC_FILES := com_lan_factorial_callMain.cpp some_other_file_name.cpp

您可以在一行中列出所有文件,也可以像这样拆分它:

LOCAL_SRC_FILES := com_lan_factorial_callMain.cpp \
    some_other_file_name.cpp

另一个错误消息是com_lan_factorial_fac.h找不到文件。这样的文件存在吗?

编辑:你的 Android.mk 是错误的。您不是在构建两个库 - 您是从两个源文件构建一个。它应该是这样的:

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) 

fac()在您的 Main.cpp 中,您应该在 #include 行和函数之间声明一个名为存在的Java_com_lan_factorial_FacLib_fac函数:

extern long fac(long n);

您的编译错误消息与缺少此行有关。

LOCAL_C_INCLUDES 行通常不是必需的。

顺便说一句,内置的 C 数据类型longjlongAndroid JNI 定义的不一样。更好地重写你fac()的工作与jlong's.

于 2012-10-10T23:52:35.983 回答