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

package club.seliote.sodemo;

public class MyJni {

    static {
// MySo是so库的名字
System.loadLibrary("MySo");
} public native static String getString(); }

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的语法是不同的),一个例子:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>;
/* Header for class club_seliote_sodemo_MyJni */ #ifndef _Included_club_seliote_sodemo_MyJni
#define _Included_club_seliote_sodemo_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: club_seliote_sodemo_MyJni
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_club_seliote_sodemo_MyJni_getString(JNIEnv *env, jclass jobj) {
return env->NewStringUTF("Hello jni world!");
} #ifdef __cplusplus
}
#endif
#endif

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

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE := ${libraryName}
LOCAL_SRC_FILES := ${cppFileName}
include $(BUILD_SHARED_LIBRARY)

一个例子:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE := MySo
LOCAL_SRC_FILES := main.cpp
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节点中加入:

sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = []
}
}

在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. WHRER条件里的数据类型必须和字段数据类型一致

    首先看案例: 表中字段FPHONE_IMEI是varchar类型的,主键也建立在FPHONE_IMEI 字段上,原则上只要where条件中用到了这个字段,就会走索引,这也是建立索引的目的,可事实是这样 ...

  2. Android - 常见的控件布局,左中右,左右等

    这里汇总的是自己在工作过程中,使用过的常见空间布局,记录在这里.详情如下: 1. 三个控件,分别处于左,中,右 要点:使用RelativeLayout <RelativeLayout andro ...

  3. [原创]在Debian9上配置NAS

    序言 此教程安装的都是最新版本的.由于是当NAS让它非常稳定的运行,所以能不安装的软件尽量不要安装. 一.准备工作 1. 更新系统 没啥,就他喵想用个最新的. apt update && ...

  4. Java—包装类、Date和SimpleDateFormat、Calendar类

    包装类 基本数据类型不能调用方法,功能简单,为了让基本数据类型也具备对象的特性,Java为每个基本数据类型提供了一个包装类,这样就可以像操作对象那样来操作基本数据类型. 基本类型和包装类之间的对应关系 ...

  5. 转发-react 性能深度探讨

    作者:尤雨溪链接:https://www.zhihu.com/question/31809713/answer/53544875来源:知乎 这里面有好几个方面的问题. 1. 原生 DOM 操作 vs. ...

  6. MyEclipse 相关配置操作、问题处理及快捷键说明

    MyEclipse傻瓜式安装不做介绍,试用期结束后破解操作见博客:MyEclipse 2014 破解补丁及激活步骤 以下为安装完MyEclipse后一般需要进行的一些配置,写来自己参考用.比较简陋,望 ...

  7. ubuntu linux安装octave

    sudo apt-add-repository ppa:octave/stable sudo apt-get update sudo apt-get install octave 安装完成后,在终端中 ...

  8. POJ-1840 Eqs---二分

    题目链接: https://vjudge.net/problem/POJ-1840 题目大意: 给出一个5元3次方程,输入其5个系数,求它的解的个数 其中系数 ai∈[-50,50]  自变量xi∈[ ...

  9. OpenGL进阶演示样例1——动态画线(虚线、实线、颜色、速度等)

            用OpenGL动态绘制线段.事实上非常easy,但到如今为止.网上可參考资料并不多. 于是亲自己主动手写一个函数,方便动态绘制线段.代码例如以下: #include<GL/glu ...

  10. BZOJ 2824: [AHOI2012]铁盘整理

    BZOJ 2824: [AHOI2012]铁盘整理 标签(空格分隔): OI-BZOJ OI-搜索 Time Limit: 10 Sec Memory Limit: 128 MB Descriptio ...