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

在前面的博客中介绍的都是使用java开发Android应用,这篇博客将介绍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,Android NDK的下载地址是:http://blog.csdn.net/DJY1992/article/details/51364430

下载完成后将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语言写的代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用c语言代码"
android:onClick="click"/> </RelativeLayout>

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

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

#include <stdio.h>
#include <stdlib.h>
#include <jni.h> /***
* 第一个参数: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程序

android JNI的.so库调用的更多相关文章

  1. 利用gdb 调试android jni c动态库

    http://blog.dornea.nu/2015/07/01/debugging-android-native-shared-libraries/ Since I haven't done thi ...

  2. Android jni编辑.so库

    引自:http://www.cnblogs.com/sevenyuan/p/4202759.html 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.ja ...

  3. Android Jni引用第三方库

    在jni下新建文件夹(jniLib)用来存放第三方so库: 将so拷贝到jniLib下,新建一个Android.mk文件: LOCAL_PATH:= $(call my-dir) include $( ...

  4. ubuntu下编译android jni到so库的mk文件配置

    项目根目录下的Android.mk文件 LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional L ...

  5. Android JNI如何调用第三方库

    http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...

  6. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  7. android JNI调用(转)

    Android jni开发资料--NDK环境搭建 android开发人员注意了 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwi ...

  8. 【转】 Android的NDK开发(1)————Android JNI简介与调用流程

    原文网址:http://blog.csdn.net/conowen/article/details/7521340 ****************************************** ...

  9. android JNI调用机制

    JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此Native语言和Java代码都运行在JVM的宿主 ...

随机推荐

  1. html标记语言 --框架

    html标记语言 --框架 六.框架 1.什么是框架 框架将浏览器划分成不同的部分,每一部分加载不同的网页 实现同一浏览器窗口中加载多个页面的效果. 语法格式<frameset>..... ...

  2. 如何解释vue的生命周期才能令面试官满意?

    当面试官问:"谈谈你对vue的生命周期的理解",听到这句话你是不是心里暗自窃喜:这也太容易了吧,不就是beforeCreate.created.beforeMount.mounte ...

  3. JAVA_将唐诗按照古文样式输出

    1. 如有唐诗: 锄禾日当午 汗滴禾下土 谁知盘中餐 粒粒皆辛苦 要求将这首唐诗按照古文样式输出,输出格式如下: 粒谁汗锄 粒知滴禾 皆盘禾日 辛中下当 苦餐土午 public class Text ...

  4. javaIO流实现文件拷贝

    package com.java.demo; import java.io.*; public class CopyDemo { public static void main(String[] ar ...

  5. localStorage学习总结

    一.本地存储 在HTML5诞生之前,网站如果想在浏览器端存储数据,只能使用Cookie,使用Cookie有较多的限制. Cookie问题: 1.cookie大小限制在4K左右(各个浏览器不一致) 2. ...

  6. windows版本的phantomjs-2.1.1-windows安装

    windows版本的phantomjs-2.1.1-windows安装 1.下载 链接:http://pan.baidu.com/s/1dEUl6dN 密码:oij8 2.安装 下载好之后解压放到某个 ...

  7. Virtual Box下虚拟机复制后ip地址重复

    通过桥接模式上网的虚拟机在复制之后,出现三台机器的ip地址都是一样的,还都可以上网, 主要是因为在复制的时候,把网卡信息啥的都一起复制了, 为了设置为不同的ip,需要修改复制后的机器的mac地址. 首 ...

  8. UVALive4727:jump

    约瑟夫环变式 设f[i][j]表示处理i个人,按照处理顺序,倒数第j个人是谁 则有f[i][j]=(f[i-1][j]+k)%i #include<cstdio> #include< ...

  9. CSAPP-过程调用,数据存储,缓冲区溢出

    程序编译: 1.预处理阶段: 1.文件包含:将#include扩展成文件正文 2.条件编译:根据#if和#ifdef将程序的某部分排除或者包含 3.宏展开:将出现宏引用的地方展开成相应的宏 2.编译阶 ...

  10. hihocoder #1073 : 光棍节

    描述 尽管付出了种种努力,jzp还是得过光棍节. jzp非常不爽,但也无能为力,只能够哀叹起来他的命运.他想到了一位长者的人生经验:"人的一生,不光要靠自我奋斗,也要考虑历史的进程" ...