如何构建共享库并在其他ndk程序中调用 [英] How to build an shared library and call it in other ndk program

查看:12
本文介绍了如何构建共享库并在其他ndk程序中调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想建立一个共享库.要构建它,我需要调用另一个共享库.这是我所做的:

1.创建一个Android工程,命名为BuildLib",在工程目录下新建文件夹jni".jni文件夹内容:

<块引用>

jni-->Android.mk
-->Application.mk
-->添加.cpp
-->add.h add.cpp 只是做两个数字相加:

添加.h:

<块引用>

int add(int a,int b);

添加.cpp:

<块引用>

#include "add.h"int add(int a,int b){返回 a+b;}

Android.mk:

<块引用>

LOCAL_PATH := $(call my-dir)包括 $(CLEAR_VARS)LOCAL_SRC_FILES := add.cppLOCAL_MODULE := 添加包括 $(BUILD_SHARED_LIBRARY)

构建项目后,我得到了目录$(BUILLDIB)/libs/armeabi/下的libadd.so.

创建另一个名为CallLib"的 Android 项目.复制libadd.soadd.h到jni文件夹,创建Android.mkApplication.mk,然后call_add.cpp.

Android.mk:

<块引用>

LOCAL_PATH := $(call my-dir)包括 $(CLEAR_VARS)LOCAL_SRC_FILES := libadd.soLOCAL_MODULE := add_prebuilt包括 $(PREBUILD_SHARED_LIBRARY)包括 $(CLEAR_VARS)LOCAL_C_INCLUDES := $(LOCAL_PATH)LOCAL_SRC_FILES := call_add.cppLOCAL_MODULE := 本机LOCAL_SHARED_LIBRARIES := add_prebuilt包括 $(BUILD_SHARED_LIBRARY)

call_add.cpp:

<块引用>

#include "add.h"int call_add(){return add(1,2);}

综上所述,我构建了 CallLib 项目,但得到了错误:

<块引用>

对 'add(int, int)' 的未定义引用;

我认为libadd.so 找不到,但我不知道如何修改.有谁知道我该如何解决这个问题?任何帮助将不胜感激.

解决方案

在您的第二个 Android.mk 中,尝试将第一个模块替换为:

LOCAL_PATH := $(call my-dir)包括 $(CLEAR_VARS)LOCAL_SRC_FILES := libadd.soLOCAL_MODULE := add_prebuiltLOCAL_EXPORT_C_INCLUDES := add.h包括 $(PREBUILD_SHARED_LIBRARY)

LOCAL_EXPORT_C_INCLUDES 标志应将标头信息附加到 add_prebuilt 模块,以便它可以与您的最终库链接.

I want to build an shared library. To build it, I need to call another shared library. Here is what I did:

1.Create one Android project,named "BuildLib",and add a new folder "jni" under the project directory. Contents of jni folder:

jni-->Android.mk
-->Application.mk
-->add.cpp
-->add.h add.cpp just do two numbers addition:

add.h:

int add(int a,int b);

add.cpp:

#include "add.h"  
int add(int a,int b){
    return a+b;}

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES  := add.cpp 
LOCAL_MODULE     := add
include $(BUILD_SHARED_LIBRARY)

After build the project,I got libadd.so under directory $(BUILDLIB)/libs/armeabi/.

Create another Android project, named "CallLib". Copy libadd.so and add.h to jni folder, create Android.mk, Application.mk, and call_add.cpp.

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := libadd.so
LOCAL_MODULE := add_prebuilt
include $(PREBUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES  := call_add.cpp 
LOCAL_MODULE     :=  native
LOCAL_SHARED_LIBRARIES := add_prebuilt
include $(BUILD_SHARED_LIBRARY)

call_add.cpp:

#include "add.h"
int call_add(){return add(1,2);}

After all above, I build the CallLib project, but got the error:

undefined reference to 'add(int, int)';

I think the libadd.so can not be found, but I don't know how to modify. Does anyone know how I can fix this? Any help will be appreciated.

解决方案

In your second Android.mk, try replacing the first module with:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := libadd.so
LOCAL_MODULE := add_prebuilt
LOCAL_EXPORT_C_INCLUDES := add.h
include $(PREBUILD_SHARED_LIBRARY)

The LOCAL_EXPORT_C_INCLUDES flag should attach the header information to the add_prebuilt module, so it can be linked with your final library.

这篇关于如何构建共享库并在其他ndk程序中调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆