Android NDK链接到静态库

时间:2012-10-23 03:38:05

标签: android-ndk

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

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

enter image description here

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)

atest.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;
}

1 个答案:

答案 0 :(得分:0)

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

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

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