`
javatoyou
  • 浏览: 1021174 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

android ndk 开发之 在 框架层使用 jni

 
阅读更多

前面说过在android上实现jni调用有两种方式,在框架层实现,在应用程序 apk上实现。

在框架上实现:

需要在 java 源码中声明, 在C++代码中实现jni的各种方法,并注册到系统中。

jni的核心是jniNativeMethod 结构体,在jni.h中声明。

typedef struct {

const char *name; //jnj 函数的名称

const cgar *signature; //参数以及返回值

void * fnptr; //对应的C/C++函数实现
}JNINativeMethod;

比如 frameworks/base/core/jni 中的 android_util_Log.cpp 是对 frameworks/base/core/java/android/util 目录中的文件

Log.java的实现。

android_util_Log.cpp 定义了结构JNINativeMethod 实现的java方法,

/*
* JNI registration.
*/
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{ "isLoggable", "(Ljava/lang/String;I)Z", (void*) android_util_Log_isLoggable },
{ "println_native", "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native },
};

gMethods[] 保存声明的方法,但要通过jni提供的注册函数注册到运行时库中,由系统启动时自动初始化,

int register_android_util_Log(JNIEnv* env)
{
jclass clazz = env->FindClass("android/util/Log");

if (clazz == NULL) {
LOGE("Can't find android/util/Log");
return -1;
}

levels.verbose = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "VERBOSE", "I"));
levels.debug = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "DEBUG", "I"));
levels.info = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "INFO", "I"));
levels.warn = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "WARN", "I"));
levels.error = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ERROR", "I"));
levels.assert = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ASSERT", "I"));

return AndroidRuntime::registerNativeMethods(env, "android/util/Log", gMethods, NELEM(gMethods));
}

registerNativeMethods 函数为系统提供的注册jni函数的方法。

在 frameworks/base/core/java/android/util 的Log.java文件中,要声明静态方法。

。。。。。。。。。。。。。。。。。。

public static native boolean isLoggable(String tag, int level);
public static int w(String tag, Throwable tr) {
return println_native(LOG_ID_MAIN, WARN, tag, getStackTraceString(tr));
}

。。。。。

基本流程就是这样, 核心点为通过 registerNativeMethods 注册到系统中,实现绑定。

util log 因其简单,是一个学习的好例子,还有其他如 android_util_Binder.cpp ,android_util_process.cpp 可以深入学习。

分享到:
评论

相关推荐

    尚硅谷Android高级开发技术之JNI和NDK开发

    而本套教程正是在Android开发中的核心重点开发技术(JNI/NDK),我们知道,Android的底层是Linux且Java的性能并不如C/C++好,所以在开发一些需要超高性能的App的时候就需要通过JNI来直接调用Android底层框架所提供的...

    《Android应用开发揭秘》附带光盘代码.

    《Android应用开发揭秘》全部实例源代码,... 16.4 AndroidNDK中使用0penGL  16.5小结  第17章 Android脚本环境  17.1 Android脚本环境简介  17.2 Android脚本环境安装  17.3如何编写Android脚本程序  17.4小结

    Android应用开发揭秘pdf高清版

    内容提要 ------------------------------------------...16.4 AndroidNDK中使用0penGL 16.5小结 第17章 Android脚本环境 17.1 Android脚本环境简介 17.2 Android脚本环境安装 17.3如何编写Android脚本程序 17.4小结

    《Android应用开发揭秘》源码

    作者简介  杨丰盛,Android应用开发先驱... 16.4 AndroidNDK中使用0penGL  16.5小结  第17章 Android脚本环境  17.1 Android脚本环境简介  17.2 Android脚本环境安装  17.3如何编写Android脚本程序  17.4小结

    pro_android_cpp_with_the_ndk.pdf

    1.1.5 在Windows平台上下载并安装AndroidNDK 1.1.6 在Windows平台上下载并安装Eclipse 1.2 AppleMacOSX 1.2.1 在Mac平台上安装Xcode 1.2.2 验证Mac平台的Java开发包 1.2.3 验证Mac平台上的ApacheANT 1.2.4 验证GNU...

    android基础框架、布局与应用开发介绍

    android基础框架、布局与应用开发介绍.. Framework是android为应用开发者设计的一套软件框架,提供了...在NDK出来之前,android应用开发者基本上只能用java来开发应用。 Android使用JNI连接了libraries和framework。

    Android 初学中阶高阶书籍_集合打包2

    巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...

    Android 初学中阶高阶书籍_集合打包3

    巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发...

    Android讲义 高焕堂 (2)

    B01_JNI开发要点_雕龙小技 B02_JNI的多线程机制 B03_NDK与OpenGL 3D绘图框架 B04_介绍SDK-Service与核心服务 B05_实机演练_撰写第一个Core Service B06_远程服务的Proxy-Stub设计...附录BX01_使用Android NDK开发工具

    android精品源码

    Android_NDK开发实例.doc Android_RIL层剖析(官方翻译).doc Android与JUnit深入浅出.pdf Android中文翻译组——Android中文API合集(4).pdf Android内存泄露调试.pdf android写的google map api 应用.zip Android...

    Android代码-各种实例库

    博客:浅谈MVP实现Android应用层开发 博客文章链接---------实例代码工程 博客:EventBus使用之基础 博客文章链接---------实例代码工程 博客:Android应用Design Support Library完全使用实例 博客文章链接--------...

    opencv_native_androidstudio, 一个带有原生Opencv的Android Studio 项目.zip

    opencv_native_androidstudio, 一个带有原生Opencv的Android Studio 项目 原生OpenCV与 Android Studio这个应用程序是一个示例 Android Studio 项目( 在版本 3.0上测试),带有原生 OpenCV 。它获得相机框架,使JNI...

    高焕堂<应用框架原理与程序设计>源代码(Eclipse)

    Windows下编译.so文件步骤(这里我使用NDK(android-ndk-1.6_r1)加Cygwin 在windows下编译,如果没有请安装, 注:android-ndk-1.6_r1只支持android 1.6或更早版本,所以这里必须将你的android工程的Target设为1.6): ...

    HDroidGUI:Harbor的Android GUI框架

    图形用户界面 Harbor的Android GUI框架 ###HDroidGUI发行版的结构: buildall.bat, buildall.sh - 整个框架交叉编译的命令脚本... jni/Android.mk、jni/Application.mk - 用于构建框架“本机”部分的动态库(“so”)

    KeepAlive:使用活页夹ioctl Android高级保活对抗Android上的强制停止杀死过程

    活着的KeepAlive是在(通过JNI复活进程)的基础上,实现了通过IOCTL复活进程,能最大程度提高复活率。 master分支是利用 libbinder.so 与 ActivityManagerService 通信的版本, ioctl分支是使用 ioctl 与 binder ...

    GitCode.rar

    Android的开发框架为我们的开发提供了不少很棒的控件,我们在开发的时候不需要太多的编码就能轻松方便的使用这些控件,不过有些时候这些系统自带的控件并不能够完全满足我们的需求。这时就需要我们发挥自己的想象力...

    Android博客来源:博客演示存储

    我的博客实例库( ##示例索引###博客:NDK-JNI实战教程(三)从比Hello World稍复杂点儿的NDK例子说说模板---------###博客:facebook Fresco框架库源使用基础---------###博客:浅谈MVP实现Android应用层开发------...

Global site tag (gtag.js) - Google Analytics