Android开发中经常遇到so,下面介绍用Android Studio创建so。Android Studio版本3.0.1.

一 编写代码

1 创建java类myJNI.java,并且声明一个native方法HelloWorld。

  native方法由java声明,由c/c++实现。

  


2  编译myJNI.java,生成class文件myJNI.class

  打开命令行工具,cd进入myJNI.java所在的目录,然后用javac myJNI.java命令编译myJNI.java,成功后在myJNI.java目录下生成myJNI.class文件

  

3 生成.h文件。

  cd到F:\CreateSo\app\src\main\java目录,使用javah -jni 包名.类名 命令生成.h文件。示例项目包名com.createso,类名myJNI。成功后会在该目录生成com_createso_myJNI.h文件。

  

4 创建c代码文件

  在main目录下新建一个jni文件夹,新建一个文件命名为com_createso_myJNI.c,把com_createso_myJNI.h文件里的内容复制到main.c中,并且实现Java_com_createso_myJNI_HelloWorld方法。

  

二 填写配置

1 在Android Studio里下载CMake和LLDB,File->Setting->Appearance->System Settings->Android SDK,点击SDK Tools标签页,勾选CMake和LLDB,点击OK开始下载。

2 在当前工程app的build.gradle的defaultConfig节点中加入:

  // 使用Cmake工具
  externalNativeBuild {
    cmake {
      cppFlags ""
      //生成多个版本的so文件
      abiFilters 'armeabi','armeabi-v7a','x86'
           }

            }

3 在build.gradle的android节点中,加入:

  //配置CMakeList.txt路径

  externalNativeBuild{

    cmake{

      path "CMakeLists.txt"

       }

            }

4 添加CMakeLists.txt文件到当前工程app的build.gradle文件同级目录下,CMakeLists.txt内容如下:

  cmake_minimum_required(VERSION 3.4.1)
  add_library( 
  # 设置so文件名称.
  TestSo

  # 设置这个so文件为共享.
  SHARED

  # 指向要编译的c文件.
  src/main/jni/chenxi_com_serialportjni_SerialPort.c)

  find_library(
  log-lib

  # Specifies the name of the NDK library that
  # you want CMake to locate.
  log )

  # Specifies libraries CMake should link to your target library. You
  # can link multiple libraries, such as libraries you define in this
  # build script, prebuilt third-party libraries, or system libraries.

  target_link_libraries( # Specifies the target library.
    # 指定目标库.
    TestSo

    # Links the target library to the log library
    # included in the NDK.
    ${log-lib} )

三 编译输出SO

  如果项目太大编译一次时间太长,这儿我们只编译创建so的这个模块:Android Studio中点击Build->Make Module "app"

  编译完成后在F:\CreateSo\app\build\intermediates\cmake\debug\obj路径下生成各个平台的so,生成的so会在指定名字的前面加上lib,即"libTestSo"。

  

用AndroidStudio创建so的更多相关文章

  1. AndroidStudio创建项目时一直处于building“project name”gradle project info的解决办法

    AndroidStudio创建项目,最后一步finish后,一直长时间处于building“project name”gradle project info,界面就一直停留在如图所示: 谷歌自家的产品 ...

  2. AndroidStudio创建新项目报错

    创建新项目自动执行时报错: Failed to import new Gradle project: failed to find Build Tools revision 17.0.0 Consul ...

  3. androidstudio创建第一个so文件

    前言:之前看安卓软件安全与逆向分析这书,看到ndk开发这节,发现自己连so文件都没编译操作过233,所以就直接上手试试, 感觉挺好玩的,把关键的加密流程都放进so中去实现,这周先写个demo试试,感觉 ...

  4. 如何使用Androidstudio创建一个新项目

    首先打开AS,然后 选择第一个选项Start a new Android Studio project 填写包名和项目名,点击next 选择项目类型,点击next 选择UI类型(都是死丢丢帮你生成的) ...

  5. 首次使用AndroidStudio创建hello world遇到的坑!(Mac系统下)

    第一次用AS,且不说它SDK配置的琐碎,光建立第一个简单的HelloWorld项目的配置包问题就把我卡了一天.这个坑必须记录一下,

  6. AndroidStudio创建jinLibs文件夹

    在文件中的buildTypes节点下添加 sourceSets.main {          jniLibs.srcDir 'libs'      } 如图

  7. 2018.5.18 AndroidStudio创建项目出错

    Android Studio 出现 Gradle's dependency cache may be corrupt 错误分析 Error:Failed to open zip file. Gradl ...

  8. 学android: android-studio从main开始

    android-studio 创建hello world很容易,一路next创建blank activity,再接好手机或者avd(andorid virtual device)就好了.  但是对于我 ...

  9. 使用AndroidStudio编译NDK的方法及错误解决方案

    参考资料: [android ndk]macos环境下Android Studio中利用gradle编译jni模块及配置:http://demo.netfoucs.com/ashqal/article ...

随机推荐

  1. 课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 0、学习目标

    1. Understand the major trends driving the rise of deep learning.2. Be able to explain how deep lear ...

  2. 剑指offer七之斐波那契数列

    一.题目 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39. 二.思路 序号:                  0  1   2   3  4   5  ...

  3. Future接口和Callable接口以及FeatureTask详解

    类继承关系 Callable接口 @FunctionalInterface public interface Callable<V> { V call() throws Exception ...

  4. 06 - JavaSE之常用类

    String类 String 类是不可变的字符序列,String 字符串一旦分配好就不能改变其内容和长度了.(如果使用 s1+=s2; 并不是在s1的后面开辟空间将s2拷贝其内,而是另外开辟一个空间, ...

  5. EventProcessor与WorkPool用法--可处理多消费者

    单一的生产者,消费者有多个,使用WorkerPool来管理多个消费者: RingBuffer在生产Sequencer中记录一个cursor,追踪生产者生产到的最新位置,通过WorkSequence和s ...

  6. 单例模式——java设计模式

    单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图               ...

  7. 你真的理解编码吗?unicode,utf8,utf16详解

    背景 前两天在网上看到一篇关于编码的讨论,仔细学习了一下unicode,utf8,utf16的定义.这篇博客旨在让读者真正理解他们是什么. 什么是编码 在阅读本文之前建议读者先去阅读这篇文章:http ...

  8. Docker Swarm 日常运维命令笔记

    之前介绍了Docker管理工具-Swarm部署记录,这里简单总结下Docker Swarm的日常维护命令,以作为平时运维笔记. Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以 ...

  9. Linux 普通用户启动nginx

    众所周知,apache的80端口为系统保留端口,如果通过其他非root用户启动,会报错如下: ()Permission denied: make_sock: could not bind to add ...

  10. [转]使用C#调用cmd来执行sql脚本

    本文转自:https://blog.csdn.net/tvmerp/article/details/1822669 下面是使用C#调用cmd来执行osql实现脚本的执行. using System; ...