【问题标题】:How to build ndk with multiple c++ files如何使用多个 c++ 文件构建 ndk
【发布时间】:2012-10-10 22:55:38
【问题描述】:

请有人帮助我。

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

我想要 2 个 .cpp 文件,一个用于类阶乘,一个将是从该类调用方法的主文件。 搭建的时候不知道怎么处理header问题,请大家帮忙。

#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

【问题讨论】:

    标签: java android android-ndk java-native-interface


    【解决方案1】:

    你的第二个文件真的叫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) 
    

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

    extern long fac(long n);
    

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

    LOCAL_C_INCLUDES 行通常不是必需的。

    顺便说一句,Android JNI 定义的内置 C 数据类型 longjlong 并不相同。最好重写您的 fac() 以使用 jlong's。

    【讨论】:

    • 我修正了一点,现在我只有一个错误,我重新发布我的问题。可以看看吗,谢谢
    • 我认为这与我的 Android.mk 有关。 @ Local_C_Inlcudes 行,我不知道我是否需要这个。如果我这样做,路径应该是什么?
    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多