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.启动模拟器,效果如下。

  • 相关阅读:
    加入创业公司有什么利弊
    Find Minimum in Rotated Sorted Array II
    Search in Rotated Sorted Array II
    Search in Rotated Sorted Array
    Find Minimum in Rotated Sorted Array
    Remove Duplicates from Sorted Array
    Spiral Matrix
    Spiral Matrix II
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5647358.html
Copyright © 2011-2022 走看看