目录

Android JNI开发一: JNI基础知识

Android JNI开发二: 如何生成SO库

Android JNI开发三: SO库的使用​​​​​​​

Android JNI开发四: 鸿蒙JNI开发​​​​​​​

本篇主要介绍如何在普通的安卓工程中使用编译好的SO库文件。首先,新建一个普通的安卓项目工程,我的工程名叫SOTest。项目工程建好后,就将SO库引入到工程中。

2.1 将SO库引入工程中

在不同的CPU架构下,会被编译成不同的SO库,所以我们需要将整个的lib文件拷贝至我们的项目工程中。SO库需要拷贝到app目录下,路径一定要正确,否则有可能出现因为路径不对而加载不到SO库。

2.2 配置SO库的路径

在build.gradle文件中添加so库的路径配置和依赖配置,如下图所示:

配置代码:

sourceSets {main {jniLibs.srcDirs = ['libs']}}implementation fileTree(include: ['*.jar'], dir: 'libs')

至此,SO库的引入和配置都好了,特别要注意SO库拷贝的目录和配置的路径一定要对应,否则会出现加载不到SO库的。

2.3 引入 JNITools 文件

SO库文件是一个动态库,无法打开,所以我们看不到里面有些什么,那么就有一个问题,如果我们把自己编译好的SO库给别人去用,别人又看不到SO里面的内容,那他怎么调SO库里面的方法呢?所以我们还需要提供一个配套的头文件给使用SO库的开发人员。这个JNITools就是头文件,当然你也可以取其他的名字。这个JNITools在我们上一节已经出现过了,这里还是把代码贴出来:

//这个包名要和原来创建SO库文件工程的包名一样,而不是现在新工程的包名
//因为SO库里面的包名也是 package com.example.jnidemo
package com.example.jnidemo;public class JNITools {static {System.loadLibrary("native-lib");}public static native int addNumber(int a, int b);public static native int subNumber(int a, int b);public static native int mulNumber(int a, int b);public static native int divNumber(int a, int b);
}

在com.example目录下再新建一个包,包名为:jnidemo,然后再引入JNITools文件。

2.4 调用SO文件中的代码

这个就跟上一节讲的安卓代码是完全一样的,这里还是把代码再重复贴一遍。

(1) activity_main.xml 里添加布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/inputa"android:hint="请输入a"android:inputType="number"android:layout_weight="1.0"android:layout_width="match_parent"android:layout_height="wrap_content" /><EditTextandroid:inputType="number"android:id="@+id/inputb"android:hint="请输入b"android:layout_weight="1.0"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout><TextViewandroid:text="请选择符号"android:layout_width="match_parent"android:layout_height="wrap_content" /><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:gravity="center"android:layout_weight="1.0"android:text="@string/add"android:id="@+id/add"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:gravity="center"android:layout_weight="1.0"android:text="@string/sub"android:id="@+id/sub"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:gravity="center"android:layout_weight="1.0"android:text="@string/mul"android:id="@+id/mul"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:gravity="center"android:layout_weight="1.0"android:text="@string/div"android:id="@+id/div"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout><TextViewandroid:id="@+id/result"android:text="计算结果"android:layout_width="wrap_content"android:layout_height="wrap_content" />
</LinearLayout>

(2) string.xml 里添加代码:

<resources><string name="app_name">JniDemo</string><string name="add">相加</string><string name="sub">相减</string><string name="mul">相乘</string><string name="div">相除</string>
</resources>

(3) MainActivity 里添加代码:

package com.example.jnidemo;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btnAdd,btnSub,btnMul,btnDiv;private EditText inputA,inputB;private TextView tvResult;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setupView();addListener();}private void addListener() {btnAdd.setOnClickListener(this);btnDiv.setOnClickListener(this);btnMul.setOnClickListener(this);btnSub.setOnClickListener(this);}private void setupView() {btnAdd=this.findViewById(R.id.add);btnDiv=this.findViewById(R.id.div);btnMul=this.findViewById(R.id.mul);btnSub=this.findViewById(R.id.sub);inputA=this.findViewById(R.id.inputa);inputB=this.findViewById(R.id.inputb);tvResult=this.findViewById(R.id.result);}@Overridepublic void onClick(View v) {double result=0;String strA=inputA.getText().toString();String strB=inputB.getText().toString();int a=Integer.parseInt(strA);int b=Integer.parseInt(strB);//这里就是通过JNI调用C语言的代码switch (v.getId()){case R.id.add:result=JNITools.addNumber(a,b);break;case R.id.div:result=JNITools.divNumber(a,b);break;case R.id.mul:result=JNITools.mulNumber(a,b);break;case R.id.sub:result=JNITools.subNumber(a,b);break;}tvResult.setText(""+result);}
}

(4) 运行效果

至此,就完整的介绍了如何生成SO库文件,以及如何使用SO库文件,你学会了么。

Android JNI开发三: SO库的使用相关推荐

  1. Android NDK开发(三)——常见错误集锦以及LOG使用,androidndk

    Android NDK开发(三)--常见错误集锦以及LOG使用,androidndk 转载请注明出处:http://blog.csdn.net/allen315410/article/details/ ...

  2. Android JNI开发入门之二

    在上一篇文章<Android JNI开发入门之一>中,我介绍了Android应用程序(APK)怎样通过JNI调用Native C实现的共享库.本文将进一步介绍Android应用程序通过JN ...

  3. Android JNI开发

    1. 在Android Studio开发JNI Android Studio第一个JNI开发入门(整理一)_sevenjoin的博客-CSDN博客_androidstudio jni开发 Androi ...

  4. arch linux arm下载_linux系统下编译给android JNI调用的Gmssl库

    编译给android JNI调用的Gmssl库的方法,网络上并不多.按照叶大强(CSDN账号:hkNaruto)写的<GmSSL Android NDK编译 (版本95c0dba>的帖子编 ...

  5. Android 蓝牙开发(三) -- 低功耗蓝牙开发

    Android 蓝牙开发(一) – 传统蓝牙聊天室 Android 蓝牙开发(三) – 低功耗蓝牙开发 项目工程BluetoothDemo 前面已经学习了经典蓝牙开发,学习了蓝牙的配对连接和通信,又通 ...

  6. Android JNI开发流程介绍

    1.什么是JNI JNI全称是Java Native Interface,中文称为Java本地接口.JNI是JAVA语言和C/C++语言沟通的协议,通过JNI,Java代码可以调用C.C++等语言写的 ...

  7. Android JNI 开发

    ①:NDK与JNI简介 NDK:Native Development Kit,是Android的一种开发工具包,能够快速开发C,C++的动态库,并自动将so和应用打包成APK.而NDK的使用场景就是通 ...

  8. Android JNI开发入门之一

    JNI在Android系统中有着广泛的应用.Android系统底层都是C/C++实现的,上层提供的API都是Java的,Java通过JNI调用底 层的实现.比如:Android API多媒体接口Med ...

  9. 鸿蒙so系统,鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

    鸿蒙JNI开发现状 现阶段,不仅鸿蒙JNI相关的开发资料较少,而且Phone相关的JNI开发资料几乎没有,这对于新入行的鸿蒙开发者们来说,非常不友好. 也可能会给Android工程(使用了SO库的工程 ...

  10. Android JNI开发入门与实战

    简介: 涉及到一些算法或者底层驱动的时候,往往需要使用jni来开发.现在官方推荐使用CMake工具来开发jni. 使用CMake开发Jni其实挺简单的,要求不高的话只需要简单配置一下就可以使用了. 配 ...

最新文章

  1. ORA-01109:数据库未打开(解决)
  2. Linux查看文件夹大小du
  3. 斯坦福-随机图模型-week1.0_
  4. Leetcode 125. 验证回文串 解题思路及C++实现
  5. zabbix历史数据mysql_处理Zabbix历史数据库办法一
  6. 动图处理_面对单刀球的几种处理方法(动图演示)
  7. SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能试读版
  8. 阿里巴巴对Java编程【注释规约】的规约
  9. mybaties与hibernate的不同点
  10. query的list()和iterate()区别 面试题
  11. 在oracle中的日期类型与String类型
  12. 性能达到原生 MySQL 七倍,华为云 Taurus 技术解读
  13. python爬虫从入门到放弃-python爬虫从入门到放弃(二)- 爬虫的深层原理
  14. [No00002D] “大学生还不如农民工”背后的“身份教育”困境
  15. 成功破解某app加密接口
  16. 【影音制作】编辑视频
  17. matplotlib learning-----案例:对比电影的票房收入(3)
  18. 微软开源!世界首个AI量化投资平台 Qlib 基本使用教程
  19. 航母级app手机淘宝是如何炼成的丨独家解密
  20. #3 GPA计算(python)

热门文章

  1. ListView实现物流追踪
  2. OpenCV(三)彩色图灰度化、通道分离、单通道反差处理(灰度图)、多通道反差处理(彩色图)
  3. 首都师范 博弈论 2 1 1占优策略与占优策略均衡
  4. oracle的gca的文件,GCA文件扩展名 - 什么是.gca以及如何打开? - ReviverSoft
  5. java实现文件分割_java 实现文件分割
  6. linux把大文件分成小文件,linux文件分割(将大的日志文件分割成小的)
  7. 【震驚】中国电信接管CDMA业务,內部FAQ (注意所有括弧的內容)
  8. 一年级上册计算机教学计划,一年级信息技术上册教学计划
  9. 大学一年级计算机应用课程,计算机应用*的课程教学计划
  10. 论文分享(一) CVPR 2018 Defense against Universal Adversarial Perturbations