[转]Android调用so文件(C代码库)方法详解

一、为什么调用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.启动模拟器,效果如下。

时间: 2024-08-24 21:30:43

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

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

http://blog.csdn.net/super_ufo/article/details/3863731 php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能 针对第一种情况,最合适的方法是用system调用,把现有C代码写成一个独立的程序.参数通过命令行或者标准输入传入,结果从标准输出读出.其次,稍麻烦一点的方法是C代码写成一个daemon,php程序用socket来和它进行

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

一.如何学习Android   android开发(这里不提platform和底层驱动)你需要对Java有个良好的基础,一般我们用Eclipse作为开发工具.对于过多的具体知识详细介绍我这里不展开,我只说我个人的学习方法和本人以为的好的步骤.   1.搭建环境:包括对Java和Eclipse及模拟器(有真机再好不过)的熟悉,对于android的tools和adb命令可以放到后面熟悉了解.   2.从helloworld开始:了解一个基本的android应用代码包含哪些,各部分做什么用.(这里只要

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

robots.txt文件,提起这个概念,可能不少站长还很陌生:什么是robots.txt文件?robots.txt文件有什么作用?如何配置robots.txt文件?如何正确使用robots.txt文件?下面,就这些问题进行剖析,让你深入认识robots.txt文件. robots.txt文件是什么? robots.txt是一个简单的以.txt结尾的文本文件,是搜索引擎Robot(也叫搜索引擎机器人)程序抓取网页时要访问的第一个文件. robots.txt文件有什么作用? 通过robots.txt

android 调用c文件生成so库并调用

公司需要做一个sdk,里面需要用到别人写的c文件,第一次做,各种百度,各种学习,现在做一个小总结: 一.新建一个project:例 ExampleDemo, 包名为:com.demo.example; 二.为项目配置ndk环境: 1.下载android ndk,并解压,我的存放目录为:D:\sl\android-develop\android-ndk-r14b: 2.点击进入Project Structure 3.在弹出框中选中 SDK Location 标签,在 Android NDK Loc

opensips/kamailio gdb代码调试方法详解

 要对kamailio/opensips进行单步调试,就需要先了解其代码的结构及运行方式,kamailio/opensips使用Reactor和Proactor结合的IO网络模型,使用主进程负责监听网络,当有连接产生或首包到达时,就通过pipe将文件描述符发送给worker进程,worker进程就会负责此连接的数据取读.业务处理.数据发送等事情,然后再次等待此socket事件.当我们想要调试一段代码时,就先确认这段代码是运行在什么类型的进程中,通常用于处理SIP逻辑的代码都是在worker进

【Android高级】安卓各种动画使用方法详解

一.概述 Android提供了几种动画类型:View Animation .Drawable Animation .Property Animation . ViewAnimation相当简单,不过只能支持简单的缩放.平移.旋转.透明度基本的动画,且有一定的局限性. Drawable Animation就是所谓的帧动画,一般作为Drawable的背景使用. PropertyAnimation产生的原因,你希望View有一个颜色的切换动画:你希望可以使用3D旋转动画:你希望当动画停止时,View的

Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程

上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑.onInterceptTouchEvent的定义为于ViewGroup中,默认返回值为false,表示不拦截TouchEvent.onTouchEvent的定义位于View中,当ViewGroup要调用onTouchEvent时,会利用super.onTouchEvent.ViewGroup调用onTo

android 调用前摄像头进行拍照的方法及完整例子

android调用camera时,可以自己写一个activity,赋上相关参数,打开前camera就可以了: 需要申请的permission,在AndroidManifest.xml中添加: <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required

Android工程:引用另一个Android工程的方法详解

本篇文章是对在Android中引用另一个Android工程的方法进行了详细的分析介绍.需要的朋友参考下 现在已经有了一个Android工程A.我们想扩展A的功能,但是不想在A的基础上做开发,于是新建了另外一个Android工程B,想在B中引用A. 一个思路是把工程A做成纯Jar包,这样其他的工程就可以直接引用了. 但是,如果在工程A中用了R.java中的引用,则无法打成jar包了.原因是R.java是自动生成的,是动态的,每次编译都是不相同的.如果一定要做成jar包,就不能使用自动生成的R文件,

【Android基础】内容提供者ContentProvider的使用详解

1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不同的软件之间数据共享,提供统一的接口.也就是说,如果我们想让其他的应用使用我们自己程序内的数据,就可以使用ContentProvider定义一个对外开放的接口,从而使得其他的应用可以使用咱们应用的文件.数据库内存储的信息.当然,自己开发的应用需要给其他应用共享信息的需求可能比较少见,但是在Andro