2012-10-23 461 views
1

未定义的参考`get_int(”)的Android NDK链接到静态库

我想在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:

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

回答

0

需要在extern "C"块包裹get_int太,否则它将被视为具有C++键。

你可以告诉它被视为一个C++函数因为链接错误中提到的函数签名(get_int()而不是get_int)。

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

+0

当我将extern“C”添加到.h和.a文件后,得到错误“undefined reference to'get_int'”。GOD!Help! – Qiengo

+0

刚刚注意到第二个问题...编辑答案 – nneonneo

+0

不幸的是,我希望使用libATest.a,这是由其他公司提供的,我无法获得源代码。现在我正在做一个测试,所以我只是建立一个名为“libATest.a”的简单静态库。 – Qiengo