JNI

cocos2d-x中通过Jni实现Java与C++的互相调用

混江龙づ霸主 提交于 2019-11-29 20:38:46
cocos2d-x中通过Jni实现Java与C++的互相调用。 cocos2d-x用开发者提供了一个类JniHelper,提供了java与c++之间互调的jni解决方案。 笔者所开发的“史上最坑爹的游戏”项目中使用到了JNI,为此专门定义了一个类JniUtil. 头文件JniUtil.h中需要引入如下两个.h文件: #include <jni.h> #include "platform/android/jni/JniHelper.h" 通过C++调用Java 声明一个函数,专门用于处理从C++调用Java的方法,所有调用Java的地方都走这个函数。 这样可以减少jni代码,通过Json来传递具体的调用指令,在java那边通过switch来进行区分,然后再通过java去调用具体的方法。 static void callJni(const char * data); 在JniUtil.cpp文件中如下实现: void JniUtil::callJni(const char *data){ JniMethodInfo minfo;//定义Jni函数信息结构体 //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数 const char * jniClass = "com/xxxx/xxxx/xxxxxxxx";//这里写你所要调用的java代码的类名

Android NDK开发之Jni调用Java对象

旧城冷巷雨未停 提交于 2019-11-29 20:38:29
本地代码中使用Java对象 通过使用合适的JNI函数,你可以创建Java对象,get、set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函数。JNI通过ID识别域和方法,一个域或方法的ID是任何处理域和方法的函数的必须参数。 下表列出了用以得到静态(static)和实例(instance)的域与方法的JNI函数。每个函数接受(作为参数)域或方法的类,它们的名称,符号和它们对应返回的jfieldID或jmethodID。 函数 描述 GetFieldID 得到一个实例的域的ID GetStaticFieldID 得到一个静态的域的ID GetMethodID 得到一个实例的方法的ID GetStaticMethodID 得到一个静态方法的ID 构造一个Java对象的实例 jclass cls = (*env)->FindClass(env, "Lpackagename/classname;"); //创建一个class的引用 jmethodID id = (*env)->GetMethodID(env, cls, "", "(D)V"); //注意这里方法的名称是"",它表示这是一个构造函数,而且构造参数是double型的 jobject obj = (*env)->NewObjectA(env, cls, id,

Android: NDK编程入门笔记

对着背影说爱祢 提交于 2019-11-29 19:54:03
为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。 3. 便于移植,用C/C++写得库可以方便在其他的嵌入式平台上再次使用。 下面就介绍下Android NDK的入门学习过程: 入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的。 一、 开发环境的搭建 android的NDK开发需要在linux下进行: 因为需要把C/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。 安装android-ndk开发包,这个开发包可以在google android 官网下载: 通过这个开发包的工具才能将android jni 的C/C++的代码编译成库 android应用程序开发环境: 包括eclipse、java、 android sdk、 adt等。 如何下载和安装android-ndk我这里就不啰嗦了,安装完之后,需要将android-ndk的路劲加到环境变量PATH中: sudo gedit /etc/environment

Android 8.1 源码_启动篇(二) -- 深入研究 zygote(转 Android 9.0 分析)

北城余情 提交于 2019-11-29 18:43:32
前言 在Android中,zygote是整个系统创建新进程的核心进程。zygote进程在内部会先启动Dalvik虚拟机,继而加载一些必要的系统资源和系统类,最后进入一种监听状态。在之后的运作中,当其他系统模块(比如 AMS)希望创建新进程时,只需向zygote进程发出请求,zygote进程监听到该请求后,会相应地fork出新的进程,于是这个新进程在初生之时,就先天具有了自己的Dalvik虚拟机以及系统资源。 开篇 核心源码 关键类 路径 init.rc system/core/rootdir/init.rc init.cpp system/core/init/init.cpp init.zygote64.rc system/core/rootdir/init.zygote64.rc builtins.cpp system/core/init/builtins.cpp service.cpp system/core/init/service.cpp app_main.cpp frameworks/base/cmds/app_process/app_main.cpp AndroidRuntime.cpp frameworks/base/core/jni/AndroidRuntime.cpp JniInvocation.cpp libnativehelper/JniInvocation

Android Zygote进程启动分析

删除回忆录丶 提交于 2019-11-29 18:42:35
dvm,app进程,linux进程三者关系 DVM指 dalivk 的虚拟机。每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟机实例。而每一个 DVM 都是在 Linux 中的一个进程,所以说可以认为是同一个概念 Zygote进程与app进程关系 Zygote是java层的进程即它也拥有一个独立的Dalvik 虚拟机实例,它是被linux层的第一个用户空间Init进程所启动的,它的主要作用就是用来孵化 app进程 和 系统进程 fork一个app进程,是通过ActivityManagerService类向Zygote发出fork命令,ActivityManagerService是在系统进程,但是Zygote处于自己的进程中,它们之间的通信没有采用binder机制,而是采用了socket机制,因此我们可以把Zygote称为一个孵化server,ActivityMamagerService称为一个client 下面的图描述了上面的过程 涉及到的类 我们先来梳理这个过程中使用到的类,并且这些类是做什么的 以server和client2个维度来归纳这些类 Zygote进程启动分析 大家都知道android系统的Zygote进程是所有的android进程的父进程,包括SystemServer和各种应用进程都是通过Zygote进程fork出来的

i.mx6 Android5.1.1 Zygote

ぐ巨炮叔叔 提交于 2019-11-29 18:38:25
0. 总结: 0.1 相关源码目录: framework/base/cmds/app_process/app_main.cpp frameworks/base/core/jni/AndroidRuntime.cpp frameworks/base/core/jni/com_android_internal_os_ZygoteInit.cpp frameworks/base/core/java/com/android/internal/os/ZygoteInit.java frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java 0.2 流程总结: 1. init.rc启动进入app_main.cpp 2. app_main.cpp查看init.rc给的相关参数,进行处理进入AndroidRuntime.cpp 3. AndroidRuntime.cpp启动虚拟机,初始化JNI,然后根据函数名通过反射机制加载zygote,进入JAVA层zygote的Zygote.java 4. 注册socket,加载各种资源(类,共享资源,共享库),启动SystemServer服务,循环接收socket,创建新进程 1. native层init.rc(进入zygote) #名字为zygote的服务,可执行文件路径为

andriod zygote

懵懂的女人 提交于 2019-11-29 18:38:10
/system/bin/app_process64 作为service 被启动,启动后comm:改成main ,cmdline 改成 zygote , main -> runtime.start( com.android.internal.os.ZygoteInit) 调用在frameworks/base/core/jni/AndroidRuntime.cpp文件中的父类 AndriodRuntime::start () {启动虚拟机) } } c语言里通过JNI语法直接调用了java语言的 com.android.internal.os.ZygoteInit 类在 frameworks/base/core/java/com/android/internal/os/ZygoteInit.java main-> startSystemServer() -> Zygote.forkSystemServer { nativeForkSystemServer{} } -> handleSystemServerProcess {} nativeForkSystemServer : JAVA里面调用C ,jni 实现在frameworks/base/core/jni/com_android_internal_os_Zygote.cpp下的com_android_internal_os

Android深入浅出之Zygote

牧云@^-^@ 提交于 2019-11-29 18:37:54
一 目的 zygote,是Android搞出来的一个东西。网上讲这个的也非常多。第一次看到这个名字我就挺郁闷,想干嘛这是?Linux下名字都取得挺通俗易懂,深得人心。zygote?不就想模仿Linux下的fork吗?个人觉得Google取名字挺怪,包括Google本身。 不管怎样,Zygote依然是Android系统的核心,zygote是受精卵的意思,可以认为是Android framework大家族的祖先!我们本节的目的是描述下zygote的来龙去脉,顺便揭露下它的短处,以后大家可以对症下药,变异一个更加优良的品种。 二 Zygote zygote本身是一个应用层的程序,和驱动,内核模块之类的没点关系。这下大家放心点了吧?zygote的启动由linux的祖先init启动。这个在init分析中提过。这里就不说了。 zygote,ps中看到的进程名叫zygote,其最初的名字是app_process,通过直接调用pctrl把名字给改成了”zygote”。不过不影响我们分析。 zygote的代码在framework/base/cmds/app_process/App_main.cpp中。我们一步步来看。 既然是应用程序,直接看main咯。 [---->main] int main(int argc, const char* const argv[]) { //参数很重要啊

Android系统启动分析(Init->Zygote->SystemServer->Home activity)

痞子三分冷 提交于 2019-11-29 18:36:48
整个Android系统的启动分为Linux Kernel的启动和Android系统的启动。Linux Kernel启动起来后,然后运行第一个用户程序,在Android中就是init程序。 ------------------------------------------------- 以下的内容应该算是学习笔记,特地整理成文。 ------------------------------------------------- 1 init程序 init是linux系统中用户空间的第一个进程。由于Android是基于linux内核的,所以init也是Android系统中用户空间的第一个进程,它的进程号是1。init程序并不是由一个源文件组成的,而是由一组源代码文件的目标文件链接而成,这些文件位于如下目录: <android source code directory>/system/core/init/ 它的主要职责在于: 1)、挂载目录,比如/sys, /dev, /proc mkdir("/dev", 0755); mkdir("/proc", 0755); mkdir("/sys", 0755); ...... 2)、初始化属性,提供property service(属性服务)管理Android系统中的属性 3)、处理配置文件命令(主要是init.rc脚本文件) 4)

JNI入门实例

自古美人都是妖i 提交于 2019-11-29 16:18:23
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C/C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。 1. 新建MyJNI目录,在其中创建MyJNI.java,其中saySomething为native方法,需要在C/C++中实现。 public class MyJNI { public MyJNI() { } public native void saySomething(String name); } 2. 编译MyJNI.java 在DOS命令行下输入 D:\codes\MyJNI>javac MyJNI.java 生成MyJNI.class 3. 导出JNI头文件 在DOS命令行下输入 D:\codes\MyJNI>javah -jni MyJNI 注意不要.class后缀,生成MyJNI.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class MyJNI */ #ifndef