如何构建一个共享库,并把它在其他NDK程序 [英] How to build an shared library and call it in other ndk program

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

问题描述

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

1,创建一款使用Android操作系统的项目,名为BUILDLIB,并在项目目录下添加一个新文件夹JNI。 JNI文件夹的内容:

  

JNI - > Android.mk
        - > Application.mk
        - > add.cpp
        - > add.h add.cpp只是做两个数字加法:

add.h:

  

INT添加(INT A,INT B);

add.cpp:

 的#includeadd.h
INT附加(INT A,INT B){
    返回A + B;}
 

Android.mk:

  LOCAL_PATH:= $(叫我-DIR)
包括$(CLEAR_VARS)
LOCAL_SRC_FILES:= add.cpp
LOCAL_MODULE:=添加
包括$(BUILD_SHARED_LIBRARY)
 

建立后的项目,我得到了libadd.so目录下的 $(BUILDLIB)/库/ armeabi /

创建另一个Android项目,命名为CallLib。复制 libadd.so add.h 来JNI文件夹,创建 Android.mk Application.mk call_add.cpp

Android.mk:

  LOCAL_PATH:= $(叫我-DIR)
包括$(CLEAR_VARS)
LOCAL_SRC_FILES:= libadd.so
LOCAL_MODULE:= add_ prebuilt
包括$(preBUILD_SHARED_LIBRARY)

包括$(CLEAR_VARS)
LOCAL_C_INCLUDES:= $(LOCAL_PATH)
LOCAL_SRC_FILES:= call_add.cpp
LOCAL_MODULE:=本地
LOCAL_SHARED_LIBRARIES:= add_ prebuilt
包括$(BUILD_SHARED_LIBRARY)
 

call_add.cpp:

 的#includeadd.h
INT call_add(){返回加(1,2);}
 

在上述所有,我建立了CallLib项目,但得到了错误:

  

未定义的引用添加(INT,INT)';

我觉得 libadd.so 无法找到,但我不知道该怎么修改。有谁知道我怎么能解决这个问题?任何帮助将AP preciated。

解决方案

在你的第二个 Android.mk ,尝试更换的第一个模块:

  LOCAL_PATH:= $(叫我-DIR)
包括$(CLEAR_VARS)
LOCAL_SRC_FILES:= libadd.so
LOCAL_MODULE:= add_ prebuilt
LOCAL_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天全站免登陆