前面说过在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的底层是Linux且Java的性能并不如C/C++好,所以在开发一些需要超高性能的App的时候就需要通过JNI来直接调用Android底层框架所提供的...
《Android应用开发揭秘》全部实例源代码,... 16.4 AndroidNDK中使用0penGL 16.5小结 第17章 Android脚本环境 17.1 Android脚本环境简介 17.2 Android脚本环境安装 17.3如何编写Android脚本程序 17.4小结
内容提要 ------------------------------------------...16.4 AndroidNDK中使用0penGL 16.5小结 第17章 Android脚本环境 17.1 Android脚本环境简介 17.2 Android脚本环境安装 17.3如何编写Android脚本程序 17.4小结
作者简介 杨丰盛,Android应用开发先驱... 16.4 AndroidNDK中使用0penGL 16.5小结 第17章 Android脚本环境 17.1 Android脚本环境简介 17.2 Android脚本环境安装 17.3如何编写Android脚本程序 17.4小结
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基础框架、布局与应用开发介绍.. Framework是android为应用开发者设计的一套软件框架,提供了...在NDK出来之前,android应用开发者基本上只能用java来开发应用。 Android使用JNI连接了libraries和framework。
巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...
巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...
Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发...
B01_JNI开发要点_雕龙小技 B02_JNI的多线程机制 B03_NDK与OpenGL 3D绘图框架 B04_介绍SDK-Service与核心服务 B05_实机演练_撰写第一个Core Service B06_远程服务的Proxy-Stub设计...附录BX01_使用Android NDK开发工具
Android_NDK开发实例.doc Android_RIL层剖析(官方翻译).doc Android与JUnit深入浅出.pdf Android中文翻译组——Android中文API合集(4).pdf Android内存泄露调试.pdf android写的google map api 应用.zip Android...
博客:浅谈MVP实现Android应用层开发 博客文章链接---------实例代码工程 博客:EventBus使用之基础 博客文章链接---------实例代码工程 博客:Android应用Design Support Library完全使用实例 博客文章链接--------...
opencv_native_androidstudio, 一个带有原生Opencv的Android Studio 项目 原生OpenCV与 Android Studio这个应用程序是一个示例 Android Studio 项目( 在版本 3.0上测试),带有原生 OpenCV 。它获得相机框架,使JNI...
Windows下编译.so文件步骤(这里我使用NDK(android-ndk-1.6_r1)加Cygwin 在windows下编译,如果没有请安装, 注:android-ndk-1.6_r1只支持android 1.6或更早版本,所以这里必须将你的android工程的Target设为1.6): ...
图形用户界面 Harbor的Android GUI框架 ###HDroidGUI发行版的结构: buildall.bat, buildall.sh - 整个框架交叉编译的命令脚本... jni/Android.mk、jni/Application.mk - 用于构建框架“本机”部分的动态库(“so”)
活着的KeepAlive是在(通过JNI复活进程)的基础上,实现了通过IOCTL复活进程,能最大程度提高复活率。 master分支是利用 libbinder.so 与 ActivityManagerService 通信的版本, ioctl分支是使用 ioctl 与 binder ...
Android的开发框架为我们的开发提供了不少很棒的控件,我们在开发的时候不需要太多的编码就能轻松方便的使用这些控件,不过有些时候这些系统自带的控件并不能够完全满足我们的需求。这时就需要我们发挥自己的想象力...
我的博客实例库( ##示例索引###博客:NDK-JNI实战教程(三)从比Hello World稍复杂点儿的NDK例子说说模板---------###博客:facebook Fresco框架库源使用基础---------###博客:浅谈MVP实现Android应用层开发------...