windows下NDK开发调用动态库里的函数报错没有定义

Tom_殇子 2012-08-14 04:44:06
是这样的,我用NDK编译C代码想在ANDROID手机上运行。但是在调用一些动态库的时候出现了一些问题,让我很头痛…… 一个多星期了,也找不到是什么原因。有个简单的例子。
main.cc 文件:
//#include <cstdio>
//#include <cstdlib>
//#include <stdexcept>
#include <android/log.h>
#include <stdio.h>
#include "add.h"

int main(int argc, char* argv[])
{

//System.loadLibrary("add");
int a=3;
int b=5;

printf("a+b = %d \n",add(a,b));
printf("Hello Android! \n");

return 0;
}


add.h文件:
int add(int a,int b);



add.c 文件:
#include <stdio.h>
int add(int a,int b)
{
return a+b;
}


Android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := add

LOCAL_SRC_FILES := add.c

include $(BUILD_SHARED_LIBRARY)


#LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)


LOCAL_CPP_EXTENSION := cc
LOCAL_MODULE := th_test
LOCAL_SRC_FILES := main.cc
#LOCAL_LDLIBS := -L./ -lSecuTFMcApi
#LOCAL_LDLIBS := -llog -ladd
LOCAL_SHARED_LIBRARIES := -L./ -ladd


include $(BUILD_EXECUTABLE)




是想把add.c文件编译成一个.so(动态库文件)库里有add()函数,可以提供给main.cc文件所调用。可是在编译的时候报错:

$ $NDK/ndk-build
Compile thumb : add <= /android-ndk-r4-crystax/samples/th_test/jni/add.c
SharedLibrary : libadd.so
Install : libadd.so => /android-ndk-r4-crystax/samples/th_test/libs/armeabi
Compile++ thumb: th_test <= /android-ndk-r4-crystax/samples/th_test/jni/main.cc
make: *** 没有规则可以创建“/android-ndk-r4-crystax/samples/th_test/obj/local/armeabi/th_test”需要的目标“/android-ndk-r4-crystax/samples/th_test/obj/local/armeabi/lib-L./.so”。 停止。






如果把ANDROID.MK文件的LOCAL_SHARED_LIBRARIES := -L./ -ladd 改为:LOCAL_SHARED_LIBRARIES := add

报错:$ $NDK/ndk-build
Compile thumb : add <= /android-ndk-r4-crystax/samples/th_test/jni/add.c
SharedLibrary : libadd.so
Install : libadd.so => /android-ndk-r4-crystax/samples/th_test/libs/armeabi
Compile++ thumb: th_test <= /android-ndk-r4-crystax/samples/th_test/jni/main.cc
Executable : th_test
/android-ndk-r4-crystax/samples/th_test/obj/local/armeabi/objs/th_test/main..o: In function `main':
/android-ndk-r4-crystax/samples/th_test/jni/main.cc:18: undefined reference to `add(int, int)'
collect2: ld returned 1 exit status
/cygdrive/e/ANDROID/android-ndk-r4-crystax/build/core/build-executable.mk:38: recipe for target `/android-ndk-r4-crystax/samples/th_test/obj/local/armeabi/th_test' failed
make: *** [/android-ndk-r4-crystax/samples/th_test/obj/local/armeabi/th_test] Error 1



这是一个很简单的例子。但是我就头痛了一个多星期没有解开! 请大侠帮个忙。
...全文
302 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hslinux 2012-08-17
  • 打赏
  • 举报
回复


问题解决了!

不要忘记结贴
Tom_殇子 2012-08-15
  • 打赏
  • 举报
回复
问题解决了! 非常感谢您的帮助。就是你说的那个问题!谢谢您的例子! 我想做您学生可以吗? 我刚大学毕业,还需要学好多的东西。
Linux-Torvalds 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

问题解决了! 非常感谢您的帮助。就是你说的那个问题!谢谢您的例子! 我想做您学生可以吗? 我刚大学毕业,还需要学好多的东西。
[/Quote]这个还真不敢当,我也是菜鸟一个,这里就是一个问问题的好地方。
Linux-Torvalds 2012-08-14
  • 打赏
  • 举报
回复
LOCAL_SHARED_LIBRARIES := libadd
#估计是这个命令出问题了

这是我在Linux下的例子。
samples/th-test/jni文件夹下面
Android.mk
LOCAL_PATH:= $(call my-dir)

# shared lib, which will be built shared library
#
include $(CLEAR_VARS)

LOCAL_MODULE := libstuff
LOCAL_SRC_FILES := stuff.c

include $(BUILD_SHARED_LIBRARY)

# exetuable
include $(CLEAR_VARS)

LOCAL_MODULE := th-test
LOCAL_SRC_FILES := main.c

LOCAL_SHARED_LIBRARIES := libstuff

include $(BUILD_EXECUTABLE)

stuff.h
#ifndef _STUFF_
#define _STUFF_

extern stuff(int x, int y);

#endif // _STUFF_


stuff.c
#include "stuff.h"

int stuff(int x, int y)
{
return x + y;
}


main.c
#include "stuff.h"

int main(void)
{
return stuff(1, 2);
}


编译结果:
$ ndk-build
Compile thumb : stuff <= stuff.c
SharedLibrary : libstuff.so
Install : libstuff.so => libs/armeabi/libstuff.so
Compile thumb : th-test <= main.c
Executable : th-test
Install : th-test => libs/armeabi/th-test

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧