android JNI的.so库调用
2016-05-10 16:38
543 查看
在一篇博客中看到一篇文章,感觉描述的还可以:
在前面的博客中介绍的都是使用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的下载地址是: 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语言写的代码
<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();
}
-------------------------------------运行之后的效果------------------------------------------------
在前面的博客中介绍的都是使用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的下载地址是: 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语言写的代码
<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总结 - BroadcastReceiver
- android JNI的.so库调用
- android JNI的.so库调用
- Android LayoutAnimation使用
- Android 屏幕分辨率 计算单位
- Android4.4打开系统相册返回Null问题
- Android 手机自动化测试工具有哪几种?
- Android之使用Pull解析Xml数据
- Android Menu 之 optionsMenu 详解
- android service 本地 远程 总结
- Android Studio系列教程六--Gradle多渠道打包
- Android 与web的相互调用
- Android高效加载大图、多图解决方案,有效避免程序OOM
- 史上最详细的Android Studio系列教程二--基本设置与运行
- Android 软键盘自动弹出和关闭
- Android手机启动流程探究
- 史上最详细的Android Studio系列教程三--快捷键
- Android资源目录---assets与res/raw区别
- Adb connection Error:远程主机强迫关闭了一个现有的连接 处理
- Android Studio系列教程五--Gradle命令详解与导入第三方包