首页 > 代码库 > android 调用c文件生成so库并调用

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 Location中选中ndk路径:

    技术分享

  4、查看local.properties

    技术分享    技术分享

  5、gradle.properties项目的末尾添加这行代码:android.useDeprecatedNdk=true

 三、开始创建操作;

  1、新建一个class,添加native方法:

    技术分享

  2、执行Build --》Make Project:

    技术分享

    完成后可以看到,我们生成了他的class文件

     技术分享

四、命令行生成.h文件

  1、打开Terminal

    技术分享

  2、在命令行输入,进入main文件: cd app/src/main 技术分享

    执行编译命令: javah -d jni -classpath [你的sdk路径]\platforms\android-22\android.jar;….\build\intermediates\classes\debug [你的包名+包含native方法的类]

     我的是:

G:\demo\QRreinrein\app\src\main>javah -d jni -classpath D:\sl\android-develop\android-sdk-windows\platforms\android-22\android.jar;..\..\build\intermediates\classes\debug com.cirein.qrcode.QRCodeManager

  完成后会在mian文件夹下生成一个jni文件,下面就是我们生成的.h文件:

    技术分享

    文件中的内容为:

      技术分享

  现在开始实现.h文件里面的方法:将.h文件复制拷贝到jni,并重命名为:main.c

    技术分享

  注:将其他的c文件也可以拷贝到jni文件夹下,在打so库的时候会一并打入;

  对main.c文件进行编辑:

    技术分享

  打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码,并执行同步操作

    技术分享

五、生成SO文件

  执行:

    技术分享

  完成后就可以看见生成的so文件了:

    技术分享

六、使用生成的so文件:

  1、新建一个module,命名为Test,包名可以自定,

  2、在\main下新建文件夹jniLibs,并将生成的SO文件拷贝到该文件夹下 

  2、在main\java 新建包,这个包名必须和创建so时调用c文件的类包名一样:com.cirein.qrcode,并将刚才的QRCodeManager复制到此包下,类名也必须与开始调用的类名相同;

  3、在MainActivity中进行调用输出:

    技术分享

    技术分享

 

 注:在同一个项目里面新建Test后,前面生成的so文件会消失,此时只需要重新 Rebuild project 一下即可

 

    

 

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