zoukankan      html  css  js  c++  java
  • [转]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:androidandroid-ndk-r8
    3.打开cygwin安装目录下homeAdministrator.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工程的binclasses目录下,然后输入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目录samplehello-jnijni目录下复制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命令,进行编译,此时会生成libsarmeabilibMyFirstJNI.so文件。如果没有看到,右键refresh一下。

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

  • 相关阅读:
    synchronized内置锁
    《JavaScript闯关记》视频版硬广
    想提高团队技术,来试试这个套路!
    从国企到阿里的面试经历(二)
    从国企到阿里的面试经历(一)
    《JavaScript 闯关记》之垃圾回收和内存管理
    《JavaScript 闯关记》之原型及原型链
    《JavaScript 闯关记》之作用域和闭包
    如何排版 微信公众号「代码块」之 MarkEditor
    《JavaScript 闯关记》之事件
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5647358.html
Copyright © 2011-2022 走看看