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 一下即可

    

时间: 2024-10-24 06:53:38

android 调用c文件生成so库并调用的相关文章

安卓之Android.mk多文件以及动态库编译

1.多文件编译 多文件编译共有两种方式: (1) 在Android.mk中一一添加 LOCAL_PATH:= $(call my-dir) #定义当前模块的相对路径 include $(CLEAR_VARS) #清空当前环境变量 LOCAL_MODULE:= test #编译生成的目标名称 LOCAL_SRC_FILES := test1.c \ test2.c \ test3.c #编译该模块所需要的源文件 # LOCAL_MODULE_PATH:=$(LOCAL_PATH) #在当前目录生成

Android开发实例-自动生成题库的数独(一)

转载请注明出处:http://blog.csdn.net/einarzhang/article/details/44834259 本系列文章主要介绍如何利用Android开发一个自动生成题目的数独游戏.涉及的知识和技术如下所示: 挖洞算法自动生成数独题目 实现自定义View用于绘制数独盘 数据库的基本操作 看着市场上千篇一律的数独应用,他们大都来自于同一个开源应用,题目都是固定不变的那么100多道.我们就没有方法改变数独题目吗?经过百度搜索,终于找到了一篇自动生成数独题库的算法,感谢原作者的理论

由动态库文件dll生成lib库文件

本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW",和MinGW的说明HOWTO Create an ImportLibrary for a DLL using MinGW,学习怎样生成lib库.当中OpenBlas的说明讲的是怎样使用Visual studio的lib.exe工具从dll生成lib文件,而MinGW讲的是怎样把一个windows

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

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

android studio 编译C生成.so文件

一.前言 前段时间有个同事离职了,用C编译的.SO文件需要更改,结果C文件是他写的,无赖啊,自己又是一个小白,不会啊,所以自己又好好钻研了一天,不会,看什么都难啊,痛苦啊,网上找了好多,才找到的,而且感觉都不怎么详细,步骤说的不是很清楚,所以自己整理了一下,谁便记录一下,好了,废话不多说,开始正题. 二.编译过程 1.编译环境的搭建 正所谓:"工欲善其事必先利其器"嘛,所以先把改准备工具准备一下,因为是在studio下编译的,所以啊,什么studio.什么sdk.什么jdk,这些都自己

java调用dll或so动态库文件(c++/c)

java调用dll或so动态库文件(c++/c) 博客分类: 工作 CC#C++JavaEclipse java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CDT(cdt-master-4.0.3)+MinGW(MinGW-5.1.4) 一:下面是java调用dll(C++) 1:下载并安装cdt :http://www.eclipse.org/cdt/downloads.php  :选择自己eclipse 支持的cdt插件,下载,并且 通过eclipse--

16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.asm  生成.obj文件 ;2.masm lib.asm  生成.obj文件 ;3.link main.obj lib.obj 生成.exe文件 ;第二种,编译方法 ;1.masm main.asm  生成.obj文件 ;2.masm 16lib.asm  生成.obj文件 ;3.lib 16lib.

【Android】使用persist属性来调用脚本文件

Android系统中有许多属性,属性由两个部分组成:name & value,可以使用这些属性来记录系统设置或进程之间的信息交换.Android系统在启动过程时会按序从以下几个文件中加载系统属性: 1./default.prop 2./system/build.prop 3./system/default.prop 4./data/local.prop 5./data/property/* 属性会按照以上文件的顺序进行加载,并且后加载的属性值会更新原先的属性值.在系统重启后,有的属性会消失,但可

Java框架JNA调用C方法(windows链接库dll文件、linux链接库so文件)

介绍 给大家介绍一个最新的访问本机代码的Java框架-JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架. JNA项目地址:https://jna.dev.java.net/ 非常强大.易用,功能上类似与.NET的P/Invoke. 不堪回首的JNI 我们知道,使用JNI调用.dll/.so共享类库是非常非常麻烦和痛苦的. 如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另