【问题标题】:Android NDK link to static libraryAndroid NDK 链接到静态库
【发布时间】:2012-10-23 03:38:05
【问题描述】:

对 `get_int()' 的未定义引用

我正在尝试在 android 中构建共享库。 该库使用来自预建静态库“libATest.a”的函数 我已经尝试了所有可以使用的方法。总是收到错误“未定义对 `get_int()' 的引用”,但我已经在 libAtest.a 中定义了它。寻求帮助! Android ndk r8

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ATest
LOCAL_SRC_FILES := libATest.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := capi
LOCAL_SRC_FILES := capi.cpp

LOCAL_STATIC_LIBRARIES := ATest
LOCAL_LDLIBS := -llog
#LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)

test.h:

int get_int();

Application.mk:

APP_MODULES :=capi

capi.cpp:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#include <string.h>
#include <android/log.h>

#include "atest.h"

#ifdef __cplusplus
extern "C" {
#endif

jstring Java_com_wzh_test_AndriodJNITestActivity_ttstest(JNIEnv* env, jobject thiz){
    get_int();
    return env->NewStringUTF("I'm from C!");
}


#ifdef __cplusplus
}
#endif

libATest.a:

#include "atest.h"
int get_int(){
    return 55;
}

【问题讨论】:

    标签: android-ndk


    【解决方案1】:

    您还需要将get_int 包装在extern "C" 块中,否则将被视为具有C++ 链接。

    您可以看出它被视为 C++ 函数,因为链接器错误提到了函数签名(get_int() 而不是 get_int)。

    编辑: 您的第二个问题是您将库源文件称为libATest.a!必须编译静态库。相反,您应该有一个包含源代码(get_int 函数)的文件atest.c,并在构建ATest 库时使用LOCAL_SRC_FILES := atest.c。您还需要删除 libATest.a 以避免任何依赖问题。

    【讨论】:

    • 在我将 extern "C" 添加到 .h 和 .a 文件后,出现错误"undefined reference to `get_int'".GOD!Help!
    • 不幸的是,我有使用libATest.a,它是由其他公司提供的,我无法获得源代码。现在我正在做一个测试,所以我只是构建一个简单的静态库命名为“libATest.a”。
    • 我要告诉你的是,你没有正确构建 your 静态库。
    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 2017-03-14
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多