Android开发之动态库调用

1.编写并生成Android下可用的动态库
(1)编写动态库源程序文件
    这里以my_add.c为例。首先进入/home/android/development/,该目录下创建文件夹
lib_test,更爱该目录的权限后进入该目录。依次执行
    # cd /home/android/development
    # mkdir lib_test
    # chmod 777 ./lib_test
    # cd ./lib_test
    在lib_test下创建my_add.c源文件,如下。
/*
my_add.c
*/
#include <stdio.h>
int add(int x, int y)
{    
    int sum = x + y;
    printf("The sum of %d and %d is %d\n", x, y, sum);
    return sum;
}

该程序计算两个整形变量的和并返回该值,同时打印求和信息。

(2)编写Android.mk文件
    在lib_test目录下创建Android.mk文件,内容如下
LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= my_add.c

LOCAL_MODULE:=libmy_add

LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)


(3)编译动态库
    进入lib_test目录,用mm命令编译动态库。
    # cd /home/android/development/lib_test
    # mm
    编译完成之后生成的动态库文件明为$(LOCAL_MODULE).so,即libmy_add.so。该动态
库位于/home/android/out/target/product/generic/system/lib目录下。


2.调用动态库
(1)编写调用动态库的源程序
    在删除之前在lib_test目录下的创建的my_add.c和Android.mk文件,并在该目录下创
建libtest.c文件以及my_add.h文件,内容如下:
/*
libtest.c
*/
#include <stdio.h>
#include "my_add.h"

int main()
{
    add(3,4);
    printf("Done\n");
    return 0;
}

my_add.h头文件:
/*
my_add.h
*/
int add(int x, int y);

(2)编写Android.mk文件
    在lib_test目录下创建Android.mk文件,内容如下。
LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=libtest.c

LOCAL_MODULE:=lib_test

LOCAL_SHARED_LIBRARIES:=libmy_add

include $(BUILD_EXECUTABLE)
注:LOCAL_SHARED_LIBRARIES指明要调用的动态库文件,这里动态库文件为libmy_add.so,
位于/home/android/out/target/product/generic/lib目录下,编译时会自动在这个目录
下寻找该动态库文件。

(3)编译
    进入lib_test目录,使用mm命令进行编译。
    # cd /home/android/development/lib_test
    # mm
    生成的可执行文件lib_test文件位于/home/android/out/target/product/generic/s
ystem/bin目录下。


3.在Android模拟器中使用
(1)启动模拟器
(2)运行程序
    等待模拟器初始化完成后,将lib_test文件push进模拟器,并将libmy_add.so文件pu
sh至模拟器的system/lib目录下。
    由于模拟器下/system/目录为制度目录,需修改权限,使用adb remount 命令。依次
执行:    
    #adb remount
    # adb push /home/android/out/target/product/generic/system/lib/libmy_add.s
o /system/lib
    # adb push /home/android/out/target/product/generic/system/bin/lib_test /d
ata
执行push命令之后登录模拟器,在模拟器终端下调用lib_test执行。
    # adb shell
    #/data/lib_test


4.隐藏动态库函数细节
    可通过选项-fvisibility=hidden将动态库中不必要暴露的函数和全局变量隐藏起来。
从而在调用动态库的时候,只有不被隐藏(开放)的函数可以调用,其他函数和变量这部
能被调用(引用)。在Android.mk文件中的LOCAL_CFLAG中加入该选项即可,及
    LOCAL_CFLAG += -fvisibility=hidden。
    而要开放的函数前只需加上__attribute__ ((visibility ("default")))限定。
    例如生成通过以下mylib.c生成动态库libmylib.so,可编写Android.mk文件为:
#Android.mk file
LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=\
    mylib.c

LOCAL_MODULE:=libmylib

LOCAL_CFLAGS +=-fvisibility=hidden

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

/*
mylib.c
*/
#include <stdio.h>

__attribute__ ((visibility ("default")))  int add(int x, int y)
{
    int sum = x + y;
    printf("%d add %d is %d\n", x, y, sum);
    return sum;
}


int sub(int x, int y)
{
    int sub = x - y;

    printf("%d sub %d is %d\n", x, y, sub);
    return sub;
}

int mul(int x, int y)
{
    int mul = x*y;

    printf("%d multiply %d is %d\n", x, y, mul);

    return mul;
}
    这样通过mm命令编译生成的libmylib.so中只有函数int add(int x, int y)是可以被
调用的,而int sub(int x, int y)和int mul(int x, int y)则不能被调用。如过源文件
调用动态库中的sub(或mul)函数,编译该文件是会出现无法找到sub函数的错误。


pdf版下载地址:
http://byhh.net/f/Android/1298215084/Android_lib.pdf

Good luck!
--
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 应用程序中调用 C# 动态链接库,可以使用 Xamarin ,它是一个跨平台的移动应用开发框架。Xamarin 允许开发人员使用 C# 编写应用程序,然后通过集成 Mono 运行时将其转换为原生代码。以下是一些基本步骤: 1. 在 Visual Studio 中创建一个 C# 类库项目,将其编译为动态链接库 (.dll)。 2. 在 Xamarin.Android 项目中添加对该类库的引用。 3. 在 Xamarin.Android 项目中使用 P/Invoke (Platform Invocation Services) 来调用该类库中的方法。 例如,假设你有一个 C# 类库项目,其中包含以下代码: ```csharp using System; namespace MyLibrary { public class MyClass { public static string MyMethod(string input) { return "Hello " + input; } } } ``` 你可以将该类库编译为 `MyLibrary.dll`。 然后,在 Xamarin.Android 项目中,你可以使用以下代码来调用 `MyMethod` 方法: ```csharp using System.Runtime.InteropServices; ... [DllImport("MyLibrary.dll")] private static extern string MyMethod(string input); ... string result = MyMethod("world"); ``` 请注意,因为 Android 和 .NET Framework 使用不同的运行时环境,因此在 P/Invoke 调用中需要使用 `DllImport` 属性来指定要调用的 DLL。在上面的示例中,我们使用 `DllImport("MyLibrary.dll")` 来指定要调用的 `MyLibrary.dll`。 此外,由于 C# 是一种类型安全的语言,因此在 P/Invoke 调用中需要使用一些技巧来将非托管代码转换为 C#。在上面的示例中,我们使用 `string` 来代表 C# 中的字符串,但是在非托管代码中,字符串通常表示为指向字符数组的指针。因此,在 C# 中调用 `MyMethod` 方法时,需要将字符串转换为指向字符数组的指针,然后在 C# 中将其转换回字符串。 这只是一个简单的示例,实际上在将 C# DLL 集成到 Android 应用程序中时可能会遇到更多的挑战。但是,如果你熟悉 P/Invoke 和 Android 开发,应该可以轻松地完成这项任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值