一、为什么调用c的dll要用源码编译成so库

Android系统是基于linux内核的移动终端系统,而dll是在windows环境下生成和调用的c库,所以不可以直接为android系统调用。

二、安装

(I)安装cygwin

1.下载cygwin
cygwin可以在windows上虚拟unix编译环境,还内置了许多linux的编辑器等工具,可供选择安装。在本项目中cygwin主要用来编译生成so库。所以重在安装gcc、make包。
到http://cygwin.com/setup.exe下载安装程序

2.选择“install from Internet”

3.选择安装目录

4.选择下载存储目录

5.选择“Direct Connection”

6.选择一个镜像点进行下载

我一开始选了个感觉比较近的给力的mirrors.163.com(速度300-400k左右),结果下载到51%不走了(1个小时左右),后来乖乖的换 回mirrors.kernel.org速度有点慢,但安装成功了(40k左右,出去溜达了,不知道用了多长时间,中午开始的晚上6点回来的)。

7.Category栏找到Devel点击右侧使Default变成install,其他包默认。安装即可。

8.测试。桌面点开该程序,输入make-v,gcc-v指令测试。

(II)安装ndk

1.下载ndk(window.zip版本),例如android-ndk-r8-windows.zip
2.解压到一个目录,如D:\android\android-ndk-r8
3.打开cygwin安装目录下home\Administrator\.bash_profile,并在末尾追加
NDK=/cygdrive/d/android/android-ndk-r8
export NDK
(传说要用vim或nodepad打开,否则cygwin不认,我本来就用的vim,所以没试验过直接用txt打开的后果)。

4.重新启动,输入cd $NDK回车,界面应如下:

5.在cygwin下用cd换到d盘要先加/cygdrive/d

三、第一个调用so的Android工程

1.新建android工程(MyFirstJNI)
2.修改代码,如下:

public class JniTest extends Activity
{/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
TextView tv = new TextView(this);
tv.setText(""+intFromJNI());
setContentView(tv);
}
public static native int intFromJNI();//口
static
{
System.loadLibrary("MyFirstJNI");
}
}

其中intFromJNI为要从so中调用的函数。我们要先为so文件生成.h文件。
3.通过cygwin跳转到Android工程的bin\classes目录下,然后输入javah命令对.class文件进行编译。如:
javah -jni com.will.myfirstjni.MyFirstJni
编译成功会在classes目录下生成.h文件,如:
com_will_myfirstjni_MyFirstJni.h
4.在项目中新建文件夹jni,将.h文件拷贝到其下,添加一个同名的.c文件。将.h中的函数拷贝到.c中添加函数的参数。如下。

#include <string.h>
#include <jni.h>
JNIEXPORT jint JNICALL Java_com_will_myfirstjni_MyFirstJni_intFromJNI(JNIEnv *k, jclass j)
{
return (jint)100000;
}

5.到ndk目录sample\hello-jni\jni目录下复制Android.mk文件到工程的jni目录。
主要修改如下两行代码:

LOCAL_MODULE    := MyFirstJNI
LOCAL_SRC_FILES := com_will_myfirstjni_MyFirstJni.c

LOCAL_MODULE--项目名
LOCAL_SRC_FILES--c文件名

6.在cygwin中跳到jni目录,输入$NDK/ndk-build命令,进行编译,此时会生成libs\armeabi\libMyFirstJNI.so文件。如果没有看到,右键refresh一下。

7.启动模拟器,效果如下。

[转]Android调用so文件(C代码库)方法详解的更多相关文章

  1. php调用C代码的方法详解和zend_parse_parameters函数详解

    php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能   针对第一种情况,最合适的方 ...

  2. robots.txt文件配置和使用方法详解

    robots.txt文件,提起这个概念,可能不少站长还很陌生:什么是robots.txt文件?robots.txt文件有什么作用?如何配置robots.txt文件?如何正确使用robots.txt文件 ...

  3. Android 调用图库选择图片实现和参数详解

    //选择图片,调用图库        bt4.setOnClickListener(new OnClickListener() { @Override            public void o ...

  4. php遍历目录与文件夹的多种方法详解

    遍历目录或遍历目录下指定类型的文件,这是每一个童鞋在写程序的时候难免会用到的.PHP本身也提供了很多灰常有用的函数,正确地使用它们,不会有错滴.下面就我个人学习过程中的一些总结,希望对想学PHP的童鞋 ...

  5. android中布局文件中 layout_weight 的属性详解

    在不同的情况下,layout_weight属性作用是不同的.主要有两种属性: 1.当布局中的控件的尺寸(宽和高)都有指定时,它所表示的该控件在父容器中的比重,及它在父容器中所占的比例,数值越大,比重越 ...

  6. Android应用盈利广告平台的嵌入方法详解

    一.如何学习Android  android开发(这里不提platform和底层驱动)你需要对Java有个良好的基础,一般我们用Eclipse作为开发工具.对于过多的具体知识详细介绍我这里不展开,我只 ...

  7. WebService核心文件【server-config.wsdd】详解及调用示例

    WebService核心文件[server-config.wsdd]详解及调用示例 作者:Vashon 一.准备工作 导入需要的jar包: 二.配置web.xml 在web工程的web.xml中添加如 ...

  8. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  9. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  10. Python调用C/C++动态链接库的方法详解

    Python调用C/C++动态链接库的方法详解 投稿:shichen2014 这篇文章主要介绍了Python调用C/C++动态链接库的方法,需要的朋友可以参考下 本文以实例讲解了Python调用C/C ...

随机推荐

  1. oracle 字符集导入、导出 、转换

    导入导出及转换 导入导出是我们常用的一个数据迁移及转化工具,因其导出文件具有平台无关性,所以在跨平台迁移中,最为常用. 在导出操作时,非常重要的是客户端的字符集设置,也就是客户端的NLS_LANG设置 ...

  2. centos在yum install报错:Another app is currently holding the yum lock解决方法

    centos在yum install报错:Another app is currently holding the yum lock,这个问题可能是很多的新手经常遇到问题,之前也有人问我,包括本人在刚 ...

  3. 如何使用yum来下载RPM包而不进行安装

    如何使用yum来下载RPM包而不进行安装 2015-03-23 13:15 theo-l译 linux.cn 字号:T | T yum是基于Red Hat的系统(如CentOS.Fedora.RHEl ...

  4. POJ 3277 City Horizon(叶子节点为[a,a+1)的线段树+离散化)

    网上还有用unique函数和lowerbound函数离散的方法,可以百度搜下题解就有. 这里给出介绍unique函数的链接:http://www.cnblogs.com/zhangshu/archiv ...

  5. Namespace, string, vector and array

    1. Headers should not include using declaration Code inside headers ordinarily should not include us ...

  6. 能量项链//区间DP

    P1056 能量项链 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第一道 描述     在Mars星球上,每个Mars人都随身佩 ...

  7. 【tyvj】P1049 最长不下降子序列

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数 第二行n个数 输出格式 最长不下降子序列的长度 测 ...

  8. 修改MDI工程主框架窗口标题(修改CREATESTRUCT结构体)

    版权声明:本文为博主原创文章,未经博主允许不得转载. //在CMainFrame类的PreCreateWindow函数中加入 m_strTitle = _T("Hello"); c ...

  9. BitMask 使用参考

    对于 Java 类应用,内存方面需要注意: 不要占用大量内存,否则可用内存少:触发 GC 或 OutOfMemoryError: 不要频繁创建对象,频繁内存分配,触发 GC. 对于枚举和常量: 使用枚 ...

  10. navigationbar的一些设置记录

    1.设置navigationbar背景颜色 [[UINavigationBar appearance] setBarTintColor:[UIColor blackColor]]; PS:如果颜色不对 ...