创建工程,新建一个类,该类需要有一个static初始化块中调用System.loadLibrary("${soName}"),还需要有用native修饰的方法声明(无需实现),一个例子:

  1. package club.seliote.sodemo;
  2. public class MyJni {
  3. static {
  4. // MySo是so库的名字
  5. System.loadLibrary("MySo");
  6. }
  7. public native static String getString();
  8. }

Build -> Make Project即可在Project\app\build\intermediates\classes\debug${packageName}${className}.class找到class文件

在Project/app/src/main上右键,新建一个JNI文件夹

打开AS的Terminal,路径切换至project/app/src/main/java下,执行javah -jni -classpath ${buildClassesDubugDir} ${packageName}.${className},比如javah -jni -classpath E:\Code\Android\SoDemo\app\build\intermediates\classes\debug club.seliote.sodemo.MyJni,这将会在jni文件夹下生成.h文件

在jni文件夹下创建一个C/CPP文件,名称随意,这里用的main,然后在其中实现.h文件中要求的方法(可以直接将.h文件内容复制过来然后修改,还需要注意这里C与CPP的语法是不同的),一个例子:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>;
  3. /* Header for class club_seliote_sodemo_MyJni */
  4. #ifndef _Included_club_seliote_sodemo_MyJni
  5. #define _Included_club_seliote_sodemo_MyJni
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class: club_seliote_sodemo_MyJni
  11. * Method: getString
  12. * Signature: ()Ljava/lang/String;
  13. */
  14. JNIEXPORT jstring JNICALL Java_club_seliote_sodemo_MyJni_getString(JNIEnv *env, jclass jobj) {
  15. return env->NewStringUTF("Hello jni world!");
  16. }
  17. #ifdef __cplusplus
  18. }
  19. #endif
  20. #endif

jni文件夹下新建Android.mk文件,内容是:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := ${libraryName}
  4. LOCAL_SRC_FILES := ${cppFileName}
  5. include $(BUILD_SHARED_LIBRARY)

一个例子:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := MySo
  4. LOCAL_SRC_FILES := main.cpp
  5. include $(BUILD_SHARED_LIBRARY)

jni文件夹下新建Application.mk,内容是APP_ABI := all

在Project Structure中配置NDK Path,之后在Terminal中切换至jni文件夹执行C:/Android/Ndk/ndk-build.cmd,即可生成so文件(app/src/main下的libs与obj文件夹内容)

在app/build.gradle的android节点中加入:

  1. sourceSets {
  2. main() {
  3. jniLibs.srcDirs = ['src/main/libs']
  4. jni.srcDirs = []
  5. }
  6. }

在Java代码中使用类似于((TextView)this.findViewById(R.id.text_view)).setText(MyJni.getString());进行调用

Android 创建 SO 文件的更多相关文章

  1. android 创建 xml文件

    android创建xml文件的方法. 要操作android的外部存储,所以要在AndroidManifest.xml文件中添加权限. <uses-permission android:name= ...

  2. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...

  3. 自动帮助创建android资源xml文件的网站

    自动帮助创建android资源xml文件的网站 http://android-holo-colors.com/ stack overflow上一个seekbar的例子: http://stackove ...

  4. Android:创建文件或文件夹以及获取sd卡根目录

    目录结构: 功能,可以根据录入的目录或者文件夹生成相应的文件或者文件夹 首先需要添加一个权限: <uses-permission android:name="android.permi ...

  5. bat如何创建多级文件夹(在android设备中)

    在android设备中要创建多个或者多级文件夹时,手动去创建费时费力(有点傻),一个bat文件就能很好的实现这个功能. 1.首先创建同级多个文件夹且在该文件夹下生成一个文件 @echo off ech ...

  6. Android创建文件夹及文件并写入数据

    package elwin.fei.mobileaudio; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  7. Android Studio:layout-sw600dp文件夹中创建activity_main.xml

    1.右键res文件夹,新建Android resource directory文件夹 2.在resource type中选择layout  3.将Directory name命名为layout-sw6 ...

  8. Android上传文件至服务器(上)

    每一次都不能上首页,真悲催..管理员让我上一次首页? 很多时候我更愿意一个人写代码,与其在垃圾代码上改改改,我更愿意直接重构. 整洁的代码简单直接.整洁的代码如同优美的散文.整洁的代码从不隐藏设计者的 ...

  9. Android入门(九)文件存储与SharedPreferences存储

    原文链接:http://www.orlion.ga/578/ Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储.SharedPreference存储以及数据库存储.当然, ...

随机推荐

  1. (三)JavaScript之[事件]与[字符串]

    5].事件**JavaScript事件:HTML事件 * HTML事件是发生在HTML元素上的事情 * HTML事件可以是[浏览器的行为],也可以是[用户的行为] * * 实例: * HTML页面完成 ...

  2. 使用UserLock如何实现工作站登陆访问限制

    UserLock允许用户限制受保护账户可登陆的工作站/终端.工作站/终端限制可以通过设置或者使用特定的IP范围,计算机名/IP或组织单位实现. 对于每个工作站限制你需要指定所要限制的会话类型(默认情况 ...

  3. Java 笔记 —— java 和 javac

    Java 笔记 -- java 和 javac h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: ...

  4. Java—数组和方法

    数组 声明数组 数组类型[] 数组名;or 数据类型 数组名[]; 如:int[] scores; 分配空间 数组名 = new 数据类型[数组长度];如:scores = new int[5]; 以 ...

  5. Homestead 中使用 laravel-mix 问题汇总

    按照 laravel 官方文档在准备使用 laravel-mix 时遇到了很多问题,许多同学应该会遇到同样的问题,自己花了一些时间来解决这些问题,在此做个笔记帮助大家减少填坑的时间. 环境 larav ...

  6. jquery对radio的操作汇总

    1.JQuery控制radio选中和不选中 通过name $("input:radio[name="analyfsftype"]").eq(0).attr(&q ...

  7. 【转】run方法与start方法的区别

    在java线程中 start与run的不同start与run方法的主要区别在于当程序调用start方法一个新线程将会被创建,并且在run方法中的代码将会在新线程上运行,然而在你直接调用run方法的时候 ...

  8. Linux远程桌面管理

    一: (1)查看用户  Linux系统root用户可强制踢制其它登录用户,首先可用w命令查看登录用户信息 [root@ylLinux~]:# w (2)强制踢人 命令格式:pkill -kill -t ...

  9. 关于(void**)及其相关的理解

    #define LOADBASSFUNCTION (f) *((void **)&f)=(void*)GetProcAddress (hBass,# f) 这一句话使用*((void**)&a ...

  10. springboot实现邮件发送

    1.创建springboot项目. 2.创建好的项目如图: 在static目录下新建index.html. 3.点击启动项目 在浏览器的地址栏中访问:http://localhost:8080/ 访问 ...