zoukankan      html  css  js  c++  java
  • Android studio如何导出.so库(NDK开发入门)

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

    项目中用到了硬件调试,google一下拿到了硬件调试的源码,可惜握草so库根本加载不进去好吗,一直报错,一怒之下自己拿他C源码重新编译一个。
    旁边小兄弟见我装逼如神,强烈要求想学习一下,所以写出这个简易教程,希望大家不会的都可以快速入门。
     
    走着,我们新建一个干净的工程,取名为NDKTest:
     
     
    如果创建的文件有差异先别管,只要你这个工程能直接跑出hello world 就行。
     
    第一步,想好你要导出的so库名叫什么,要丢到哪些设备上去。如果你是第一次,不要用脑先,直接按照图中的方案去写。
     
    1 ndk {
    2     moduleName "jssc"
    3    abiFilters "armeabi", "armeabi-v7a", "x86"}
    4  
    其中,moduleName就是你会打包出来的报名,下面的三个相信各位用到第三方库的时候都会见到,这是根据应用系统架构的不同针对性出的包,如果写错,在build的时候会报错的;
    NDK如果报错,请百度如何安装ndk,遇到aboring什么的,可能是文件夹名写错了。
    gradle.properties最下面加上
    android.useDeprecatedNdk=true
     
     
     
    第二步,改造一下你的MainActivity,并将其搞成这样(随你搞成什么样,只是为了方便调试)
    按钮记得加监听事件。
    搞完了摆在那里别动,我们等会来调教。
     
     
    重点来了
    我们首先要创建一个调用native方法的专用类,这个类负责桥梁作用,给C和JAVA提供交互依据。
    1 public class NativeInteface {
    2     static { //载入名为“lb”的C++库
    3         System.loadLibrary("jssc");
    4     }
    5     public native int Count(inta, int b);
    6 }
     
    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.   
    5. #ifndef _Included_ndkyao_com_ndktest_NativeInteface  
    6. #define _Included_ndkyao_com_ndktest_NativeInteface  
    7. #ifdef __cplusplus  
    8. extern "C" {  
    9. #endif  
    10. /* 
    11.  * Class:     ndkyao_com_ndktest_NativeInteface 
    12.  * Method:    addInt 
    13.  * Signature: (II)I 
    14.  */  
    15. JNIEXPORT jint JNICALL Java_ndkyao_com_ndktest_NativeInteface_Count  
    16.   (JNIEnv *, jobject, jint, jint);  
    17.   
    18. #ifdef __cplusplus  
    19. }  
    20. #endif  
    21. #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.   
    4. //返回一个a+b的值  
    5. JNIEXPORT jint JNICALL Java_ndkyao_com_ndktest_NativeInteface_Count (JNIEnv *, jobject, jint a, jint b) {  
    6. return a + b;  
    7. }  


     
     
    相信以大家的慧根随便造化造化应该很明白这串代码啥意思。
    保存。
     
    好,回到MainActivity,写onclick的回调了;
    好,跑一下瞧瞧:
    OK,大工搞成;
    接下来我们看看生成了哪些玩意。
     
    哟呵?啥都有耶!这特么不就是我们要的so库吗?
     
    好,把这三个文件夹copy出来!我们丢到lib文件夹下面去,然后在app/builde.gradle里面这么配置一下然后build:
     
    整个任务就完成了。
  • 相关阅读:
    Vue,动画-修改v-前缀
    Vue,动画-使用过度类名实现动画(渐变)
    sqli-labs闯关之21-30关
    sqli-labs闯关之11-20关,第18关有burpsuit的具体使用方法
    sqli-labs闯关之1-10关
    sqli-labs的搭建
    DVWA-SQL注入
    华为NAT配置
    基础过滤工具——ACL控制访问列表(Access Control List)
    DHCP——基于接口地址的池的DHCP
  • 原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/7590940.html
Copyright © 2011-2022 走看看