Chinaunix首页 | 论坛 | 博客
  • 博客访问: 465242
  • 博文数量: 145
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1060
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-22 11:52
个人简介

专注计算机技术: Linux Android 云计算 虚拟化 网络

文章分类

全部博文(145)

文章存档

2016年(3)

2015年(21)

2014年(75)

2013年(46)

我的朋友

分类: Android平台

2014-08-21 21:25:33

一、为什么调用c的dll要用源码编译成so库  
Android系统是基于linux内核的移动终端系统,而dll是在windows环境下生成和调用的c库,所以不可以直接为android系统调用。
二、安装  
(I)安装cygwin
 
1.下载cygwin  
cygwin可以在windows上虚拟unix编译环境,还内置了许多linux的编辑器等工具,可供选择安装。在本项目中cygwin主要用来编译生成so库。所以重在安装gcc、make包。  
到下载安装程序  

2.选择“install from Internet”

       

3.选择安装目录

4.选择下载存储目录

5.选择“Direct Connection”

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

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

7.Category栏找到All 点击右侧使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.修改代码,如下:  
 
[java] view plaincopy
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跳转到bin\classes目录下,然后输入javah命令对.class文件进行编译。如:
javah -jni com.will.myfirstjni.MyFirstJni
编译成功会在classes目录下生成.h文件,如:
com_will_myfirstjni_MyFirstJni.h
4.在项目中新建文件夹jni,将.h文件拷贝到其下,添加一个同名的.c文件。将.h中的函数拷贝到.c中添加函数的参数。如下。
[cpp] view plaincopy
#include  
#include  
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目录。
主要修改如下两行代码:
[html] view plaincopy
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.启动模拟器,效果如下。  

    行业门户()文章,希望大家可以留言建议

阅读(1427) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~