转自:http://blog.csdn.net/ssy_neo/article/details/51758687

项目中用到了硬件调试,google一下拿到了硬件调试的源码,可惜握草so库根本加载不进去好吗,一直报错,一怒之下自己拿他C源码重新编译一个。
旁边小兄弟见我装逼如神,强烈要求想学习一下,所以写出这个简易教程,希望大家不会的都可以快速入门。
 
走着,我们新建一个干净的工程,取名为NDKTest:
 
 
如果创建的文件有差异先别管,只要你这个工程能直接跑出hello world 就行。
 
第一步,想好你要导出的so库名叫什么,要丢到哪些设备上去。如果你是第一次,不要用脑先,直接按照图中的方案去写。
 
 ndk {
moduleName "jssc"
abiFilters "armeabi", "armeabi-v7a", "x86"}
其中,moduleName就是你会打包出来的报名,下面的三个相信各位用到第三方库的时候都会见到,这是根据应用系统架构的不同针对性出的包,如果写错,在build的时候会报错的;
NDK如果报错,请百度如何安装ndk,遇到aboring什么的,可能是文件夹名写错了。
gradle.properties最下面加上
android.useDeprecatedNdk=true
 
 
 
第二步,改造一下你的MainActivity,并将其搞成这样(随你搞成什么样,只是为了方便调试)
按钮记得加监听事件。
搞完了摆在那里别动,我们等会来调教。
 
 
重点来了
我们首先要创建一个调用native方法的专用类,这个类负责桥梁作用,给C和JAVA提供交互依据。
 public class NativeInteface {
static { //载入名为“lb”的C++库
System.loadLibrary("jssc");
}
public native int Count(inta, int b);
}
 
static{}的意思大家都知道,只要new 这个对象的时候我们就会加载so库,注意so库的文件名,要和我们之前在配置文件里面写的一毛一样。
然后下面的native方法就是我们打算从C里面去取的,现在就叫a和b,等会我们在C里面把他加起来然后返回就好。
OK,做到这里我们要开始搞C了。
不过先等等。
 
 
我们先build -->makeProject先,因为下一个环节我们要用到刚才写好的NativeInteface。
希望你能找到,以上步骤全是Android的常用操作规范,只要代码和构建普通项目都是好的就不会有问题。除非你插件或者gradle或者ndk或者MainActivity的代码有问题。
 
找到以后我们打开Android studio的Teminal,先进入到debug文件夹:
这句可以照抄
cd app/build/intermediates/classes/debug   
然后把NativeInteface这个.class编译成.h文件
javah -jni ndkyao.com.ndktest.NativeInteface
结构为:包名+类名;
这部如果JDK是好的一般不会报错,然后我们放眼望去,
 
多出了一个.h文件有木有?
OK,接下来就要创建JNI文件夹了。
进main文件,新建一个jni文件夹,如图。把上面的.h拷贝进去。
打开这个.h瞧瞧:
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class ndkyao_com_ndktest_NativeInteface */
  4. #ifndef _Included_ndkyao_com_ndktest_NativeInteface
  5. #define _Included_ndkyao_com_ndktest_NativeInteface
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class:     ndkyao_com_ndktest_NativeInteface
  11. * Method:    addInt
  12. * Signature: (II)I
  13. */
  14. JNIEXPORT jint JNICALL Java_ndkyao_com_ndktest_NativeInteface_Count
  15. (JNIEnv *, jobject, jint, jint);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif
关键信息:
extern "C" :由C来向外提供方法;
JNIEXPORT jint JNICALL Java_ndkyao_com_ndktest_NativeInteface_addInt
(JNIEnv *, jobject, jint, jint);:
方法结构 :
JNIEXPORT j返回类型 JNICALL Java_包名_类名_方法名{
((JNIEnv *, jobject, j类型, j类型); )
}
 
 
行了,这里就搞完了。
接下来我们在jni文件夹下新建一个C/C++ Source file;
取名就叫TestC吧。
 
打开它,按着教程敲入以下代码:
 
 
  1. //导入刚才生成的.h文件
  2. #include "ndkyao_com_ndktest_NativeInteface.h"
  3. //返回一个a+b的值
  4. JNIEXPORT jint JNICALL Java_ndkyao_com_ndktest_NativeInteface_Count (JNIEnv *, jobject, jint a, jint b) {
  5. return a + b;
  6. }
 
 
相信以大家的慧根随便造化造化应该很明白这串代码啥意思。
保存。
 
好,回到MainActivity,写onclick的回调了;
好,跑一下瞧瞧:
OK,大工搞成;
接下来我们看看生成了哪些玩意。
 
哟呵?啥都有耶!这特么不就是我们要的so库吗?
 
好,把这三个文件夹copy出来!我们丢到lib文件夹下面去,然后在app/builde.gradle里面这么配置一下然后build:
 
整个任务就完成了。

Android studio如何导出.so库(NDK开发入门)的更多相关文章

  1. 使用Android Studio 1.3 版本号进行NDK开发

    众所周知Android Studio 1.3 版本号新增了NDK支持,能够非常方便的在上面开发C++或者C代码了,但是预览版功能不是非常完好,须要非常多步骤,另一些奇怪的BUG,整了半天最终能够使用A ...

  2. Android Studio 如何导出和导入自己的常用设置,避免重复制造轮子。加快开发速度

    Android Studio 如何导出和导入自己的常用设置,避免重复制造轮子.加快开发速度 作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 在使用 A ...

  3. Android Studio中导入第三方库

    之前开发Android都是使用的eclipse,近期因为和外国朋友Timothy一起开发一款应用,他是从WP平台刚切换使用Android的,使用的开发环境时Android Studio,为了便于项目的 ...

  4. Android Studio下导出jar包和aar包

    Android Studio下导出jar包和aar包 jar包和aar包的区别 步骤 1. 创建Android工程 创建工程比较简单,不错复述 2. 创建一个Library(Module) 创建了一个 ...

  5. Android Studio && GitHub 团队多人一起开发

    曾几何时,花了两天的时间搞了合并项目,搞得乱七八糟der,但最终还是被我搞定了,too 乱 to 做笔记.过了几个月,也就是前几天,抱着从头开始的决心,再次尝试,然鹅并没有结果.今天,再一次重新开始, ...

  6. Visual Studio 2015 和 Apache Cordova 跨平台开发入门

    原文:Visual Studio 2015 和 Apache Cordova 跨平台开发入门(一) 基于 Windows 10 的 Visual Studio 2015 跨平台的应用开发主要分为基于V ...

  7. android studio ndk 开发入门

    ndk 开发没什么神秘的ndk 说白了就是一个交叉编译的工具链,用它来生成各个CPU架构下的静态或动态链接库,linux 下就是 .a 和 .so 文件.原理就是 java 通过 JNI 和 C.C+ ...

  8. Android Studio NDK开发入门

    从Android Studio 1.3 Beta1开始,就支持了NDK,我目前使用的版本是1.5.首先强调几点. 1.必须安装NDK并配置好环境变量(和配置JDK环境变量如出一辙:新建NDK_HOME ...

  9. Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    Note:这篇文章是基于Android Studio 3.01版本的,NDK是R16. step1:创建一个包含C++的项目 其他默认就可以了. C++ Standard 指定编译库的环境,其中Too ...

随机推荐

  1. loadrunner中并发数与迭代的区别

    你的理解的虚拟用户应该是 迭代次数 ,录制脚本时只会有1个虚拟用户,1个虚拟用户可以有多次 迭代,也就是 重复执行 Action里面的内容,在场景设置的时候,如果你说的10时在runtime-sett ...

  2. thinkphp5.0生命周期

    本篇内容我们对ThinkPHP5.0的应用请求的生命周期做大致的介绍,以便于开发者了解整个执行流程. 1.入口文件 用户发起的请求都会经过应用的入口文件,通常是 public/index.php文件. ...

  3. 洛谷P2231 [HNOI2002]跳蚤 [数论,容斥原理]

    题目传送门 跳蚤 题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+ ...

  4. JavaScript的类型体系

    一:总体的类型系 基本类型:数字类型(number),字符串类型(string),布尔类型(boolean); 复合类型:对象(对象,函数,数组等); 无类型:null(有定义),undefined( ...

  5. shell脚本基本用法

    下面是一些简单常用的脚本,工作中可能会用到,记录一下. #!/usr/bin/env bash #变量[=两边不要有空格], 在使用的时候需要用${变量名} 或者是$变量名 name="sa ...

  6. (转) redis的事务和watch

    redis的事务 严格意义来讲,redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的. redis中的事务定义 Redis中的事务(transaction)是一组命令的集合. 事务同 ...

  7. 【LeetCode】32. Longest Valid Parentheses

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  8. RxJava 机制

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha rxjava 是  以 响应式 编程思想   编程的 java类库

  9. NOIP2018提高组题解

    D1T1:铺设道路 回忆NOIP2013D2T1 积木大赛,发现这两题唯一的区别就是一个是造山一个是填坑,而把填坑的操作反序就是造山,所以可以直接使用那道题的方法. 具体方法是,从左到右每次考虑新的一 ...

  10. [ZROI #316] ZYB玩字符串

    Introduction 每次在一开始为空的串$S$的任意位置插入串$p$ 给出最终的$S$,求长度最短(相同时字典序最小)的串$p$ Solution: 样例出锅差评啊,让我这种直接看样例选手挂掉5 ...