博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android JNI的.so库调用
阅读量:7224 次
发布时间:2019-06-29

本文共 2983 字,大约阅读时间需要 9 分钟。

在一篇博客中看到一篇文章,感觉描述的还可以:

在前面的博客中介绍的都是使用java开发应用,这篇博客将介绍java通过使用jni调用c语言做开发

为了更加形象的介绍jni,先观察下面的图片,下图表示的是整个android系统架构

图中从上到下的结构依次是:

Application:表示应用层,其实就是指android手机上的应用

Application Framework:表示应用框架层,我们平时用java开发app就是使用应用框架层提供的API做开发

Libraries:android类库,使用C/C++开发的android类库

Android Runtime:android运行环境

Linux Kernel:Linux内核

通过上图可知Android系统分为五个部分,分别是Application(应用层)、Application Framework(应用框架)、Librarise(Android 类库)、Android Runtime(Android 运行环境)、Linux Kernel(Linux内核),且android应用框架使用java开发的,android类库使用c/c++开发的,为了使得java开发应用框架能调用c/c++开发的android类库,android中引入了一个jni,通过jni可以实现java调用c/c++,c/c++调用java

开发jni需要准备的工具:

参考:

Android ndk,Android NDK的下载地址是:  

下载完成后将ndk解压的一个任意的目录下,我解压在 D:\develop

建议文件目录不要带空格,解压后将ndk所在的路径添加到环境变量中

打开android ndk后,可以看到android ndk的目录结构如下:

android ndk目录结构介绍:

docs:帮助文档

build/tools:linux的批处理文件

platforms:编译c代码需要使用的头文件和类库

prebuilt:预编译使用的二进制可执行文件

sample:jni的使用例子

source:ndk的源码

toolchains:工具链

ndk-build.cmd:编译打包c代码的一个指令

使用ndk实现一个简单的Hello World程序

第一步:使用eclipse创建一个Android工程,并且将工程的名称命名为HelloJni

第二步:修改activity_main.xml文件,在布局上添加一个按钮点击按钮后调用c语言写的代码 

第三步:
在创建好的android工程下新建一个jni文件夹


第四步:在jni文件夹下新建一个hello.c文件,并在hello.c文件中添加下面的代码 

#include 
#include
#include
/*** * 第一个参数:java虚拟机的内存地址 * 第二个参数:调用helloFromC方法的java对象 */ Java_com_example_hellojni_MainActivity_helloFromC(JNIEnv* env, jobject obj) { //创建一个c语言的字符串,并且初始化字符串 char* arr = "hello world jni !"; //把c语言的字符串转换成java的字符串 jstring jstr = (*env)->NewStringUTF(env, arr); //返回字符串 return jstr; }

第五步:在jni文件夹下新建一个Android.mk文件,并在Android.mk中添加下面的代码 

LOCAL_PATH := $(call my-dir)       include $(CLEAR_VARS)       #编译生成的文件的类库叫什么名字     LOCAL_MODULE    := hello          #要编译的c文件     LOCAL_SRC_FILES := Hello.c       include $(BUILD_SHARED_LIBRARY)

第六步:
编译android ndk程序

1、打开命令行,并且进入到jni所在的目录

2、输入ndk-build.cml命令编译android ndk

3、看到下图所示的提示表示android ndk编译成功

4、此时打开libs文件夹下的armeabi文件夹,可以看到armeabi文件夹下生成了一个libhello.so文件

      这个就是Android ndk编译后生成的文件,在后面就可以直接使用libhello.so文件

最后一步:使用通过ndk编译好的,修改MainActivity.java文件

package com.example.hellojni;    import android.app.Activity;  import android.os.Bundle;  import android.view.View;  import android.widget.Toast;    public class MainActivity extends Activity {            static {                    //加载打包完毕的so类库          System.loadLibrary("hello");      }        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);      }            //调用c语言代码按钮响应函数      public void click(View view) {                    //使用吐司对话框显示c语言代码中的函数helloFromC()的返回值          Toast.makeText(this, helloFromC(), Toast.LENGTH_SHORT).show();      }            //定义一个本地方法,方法体由C语言实现      public native String helloFromC();  }

-------------------------------------运行之后的效果------------------------------------------------
运行android程序后手机上会显示下图所示的界面
点击按钮后弹出吐司,并且在吐司中显示"hello world jni !"表示Android成功的调用了c语言开发的jni程序

你可能感兴趣的文章
新浪微博数据Json格式解析
查看>>
WLAN 802.11 wifl区别
查看>>
oracle授权动态视图权限给用户
查看>>
Debian – 出现-bash: pip: command not found错误解决办法
查看>>
Zxing扫描二维码
查看>>
我的友情链接
查看>>
aspcms后台拿shell漏洞(非添加模块)及修复方法
查看>>
C语言冒泡排序法
查看>>
B2B行业门户网站群发邮件时间及发送频率
查看>>
关于虚拟机能ping通物理机,而物理机ping不通虚拟机问题解决。
查看>>
同台机器启动多个mysql
查看>>
iframe 跨域高度自适应
查看>>
struts2+hibernate3+spring3(ssh2)框架下的web应用
查看>>
Linux下的三个时间属性
查看>>
semanage
查看>>
[case分享]Exchange 2010 登陆OWA查看邮件出现Rights managem operation failed
查看>>
linux dd 读取 写入磁盘速度
查看>>
dmidecode查看linux硬件信息
查看>>
linux监控对象及重要性
查看>>
walle-web自动化部署配置
查看>>