【Android应用开发】-(14)JNI----经典实例分析
来源:互联网 发布:网络安全员培训班 编辑:程序博客网 时间:2024/06/17 05:49
接下来几篇文章,学习JNI开发,主要是学习《JNI详解》,将里面的实例通过Android平台实现,首先由一个经典实例引出 – HelloWorld!!HelloWorld是经典的,一想起学编程,就想起那些年我们一起写过的HelloWorld。这里用HelloWorld来讲解JNI的开发过程。这个过程大致可通过下图来说明:
1) 新建一个HelloWorld工程;
2) 创建一个带有native方法的类Helloworld.java;
package org.winplus.helloworld;public class HelloWorld {public native void print(); private void stitic() {System.loadLibrary("helloworld");}}
HelloWorld类首先声明了一个publicnativevoid print()方法。Static包含的是本地库。在java代码中声明为native的本地方法只作为声明存在。在调用本地方法之前,必须先装载含有该方法的本地库,如HelloWorld中所示,置于static中,在JavaVM初始化一个类时,首先会执行这段代码,这可保证调用本地方法之前装载了本地库。转载的机制请看后文…
3) 使用javac编译Helloworld.java
使用Eclipse的同学不需要做此动作,都自动编译了。进入Class目录。
4) 使用javah –jni 编译Helloworld.class 生成头文件 Helloworld.h;Javah –jni org.winplus.helloworld.HelloWorld会生成一个名为:org_winplus_helloworld_ HelloWorld.h的头文件。生成的代码如下:/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class org_winplus_helloworld_HelloWorld */#ifndef _Included_org_winplus_helloworld_HelloWorld#define _Included_org_winplus_helloworld_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: org_winplus_helloworld_HelloWorld * Method: print * Signature: ()V */JNIEXPORT void JNICALL Java_org_winplus_helloworld_HelloWorld_print (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
我们注意到JNIEXPORTvoid JNICALL Java_org_winplus_helloworld_HelloWorld_print(JNIEnv *,jobject);这里我们注意到JNIEXPORT和JNICALL两个宏,我们看到这个函数声明接收两个参数而对应的Java代码中并没有参数。第一个参数是指向JNIEnv结构的指针;第二个参数,为HelloWorld对象自身,即this指针。
5) 使用C实现头文件中的函数
#include <jni.h>#include <stdio.h>#include "android/log.h"#include "HelloWorld.h"static const char *TAG="HelloWorld";#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)JNIEXPORT void JNICALL Java_org_winplus_helloworld_HelloWorld_print (JNIEnv *env, jobject obj){LOGI("Hello World");return; }
这里为了方便看到打印信息,使用了jni中的log.h头文件和ANDROID_LOG_INFO宏。
6) 编译C文件生成本地库。这一步比较繁琐,请下载源码看吧。具体步骤
a) 将头文件及C文件拷贝到jni目录,并编写Android.mk和Application.mk文件
b) 通过ndk或者在Ubuntu下编译,生成helloworld.so文件
c) 将生成的文件拷贝到libs/armeabi目录下,并更改名字为:libhelloworld.so
7) 运行程序,查看结果。
源码下载==》
- 【Android应用开发】-(14)JNI----经典实例分析
- Android JNI 应用实例
- JAVA JNI开发应用实例
- Android JNI开发(10)--实例
- android开发经典实例
- Android Studio Jni 开发实例
- Android Studio JNI开发实例
- 使用JNI开发Android应用
- 使用JNI开发Android应用
- [Android 内核开发] JNI 开发实例(一)
- Android JNI 应用实例
- Android JNI 应用实例
- Android开发入门经典实例
- Android开发入门经典实例
- Android开发入门经典实例
- Android开发入门经典实例
- Android开发入门经典实例
- Android开发入门经典实例
- 免费开源的vtiger crm 客户关系管理系统- vtiger crm 模块功能详细介绍
- dimension资源的用法
- 基于颜色矩阵原理的图片处理概述
- 赴日本留学的基本条件
- matlab(本人的0资源完整版电子书教程)
- 【Android应用开发】-(14)JNI----经典实例分析
- mysql 中查找 \ 删除 作者名字重复 语句
- Jenkins --- git can't clone:Permission denied (publickey).
- 编码
- js的className
- C#连接SQLite的...方法
- android界面研究 :Activity的Title设置
- GEF显示简单的标尺
- UITableView 动态增加删除行