2013-02-08 9:44:15 上孙安俊(359***041) 请问大家一个问题,业务用例的研究组织可以在同一个建设系统中可以变化吗?...2013-02-08 9:44:51 潘加宇(3504847) 没有必要变化了 2013-02-08 9:46:55 潘加宇(3504847) 这个划定的范围,能把你要改进的场景被包在里头就可以。...2013-02-08 9:48:41 上孙安俊(359***041) 如果想做一个部门业务管理系统, 2013-02-08 9:48:54 上孙安俊(359***041) 有时间,从部门外面,接报问题,...2013-02-08 9:51:42 潘加宇(3504847) 部门就可以了,把这些场景组织到部门的用例下面 2013-02-08 9:54:44 潘加宇(3504847) 既然改进的范围波及整个部门,...2013-02-08 11:11:15 潘加宇(3504847) 请假本身不是部门的用例,但会影响部门的某些用例的实现,把请假作为一个场景放在这些用例下面。
JavaVM提供了调用接口的函数,它允许你创建或销毁JavaVM。理论上在同一个进程中你可以有多个JavaVM,但 Android 只支持一个。 JNIEnv提供了大部分 JNI 函数。...绑定本地创建的线程时会构造 java.lang.Thread对象,并把它添加到 "main"线程组(ThreadGroup)中,使得 debugger 可以知道它。...另外,因为每个进程只能有一个 JavaVM 的限制,所以需要将数据存放在静态本地结构中是合理的。 类的引用(jclass),fieldID, methodID在类卸载前都是有效的。...引用同一个对象有两个不同的引用值也是有可能的。例如,在同一对象上连续调用NewGlobalRef的返回值可能不同。查看两个引用是否指向同一个对象必须使用 IsSameObject 方法。...千万别使用 “==” 比较两个引用。 一个后果是,在本地代码中你不能假定对象引用是不变的或唯一的。
第一个参数是优先级,和Log的等级是对应的,第二个参数是tag,第三个参数是log内容。 关于更多内容和方法可以参考log.h的注释。...全局引用和局部引用 试想一种场景,在JNI_OnLoad中通过FindClass找到某一个类,然后用作静态变量,在以后某个场景使用该静态场景,一些是不是设想的很美好,但在JNI环境中是不行的。...log_class = log_clazz; return JNI_VERSION_1_4; } Java端调用 这里定义一个native方法,去使用静态的log类,打印日志,如下代码: if...hl=zh_cn#kotlin 三种引用 在JNI规范中定义了三种引用:局部引用、全局引用、弱全局引用。 局部引用:通过NewLocalRef和各种JNI接口创建。...全局引用:调用NewGlobalRef基于局部引用创建,会阻止GC回收所引用的对象。可以跨方法、跨线程使用。JVM不会自动释放,必须调用DeleteGlobalRef手动释放。
它们本质上都是指向函数表指针的指针(在C++版本中,它们被定义为类,该类包含一个指向函数表的指针,以及一系列可以通过这个函数表间接地访问对应的JNI函数的成员函数)。...JavaVM提供“调用接口(invocation interface)”函数, 允许使用者创建和销毁一个JavaVM。理论上可以在一个进程中拥有多个JavaVM对象,但Android只允许存在一个。...类型安全:从你的Native代码中返回了一个不兼容的类型(比如说,从一个声明返回String的方法却返回了StringBuilder)。...在Native代码中较好的做法是: 在一个静态类初始化时调用System.loadLibrary(见之前的一个例子中,当中就使用了nativeClassInit)。...全局弱引用 在Android 2.0(Eclair)之前,全局弱引用没有被实现。如果试图使用它们,老版本将完全不兼容。你可以使用Android平台版本号常量来测试系统的支持性。
前言 ijklayer可以说是目前最火的一款移动端播放器了。它同时支持Android和iOS,是由著名的B站开源的播放器库,在GitHub上有15.2K的 start。...它之所以如此流行,主要是代码写的太美了,我认为把它当作艺术品也不过分。没看过它代码的同学可以去了解一下。 ijkplayer为了提高性能做了大量的优化,其中一个关键点是使用了JNI。...在Android系统下,每一个进程只能有一个JavaVM。 我们第一步看下在ijkplayer里,如何通过 Java代码调到 C/C++接口。...C/C++调用Java方法 在 ijkplayer 中,它会使用C调用android下的 MediaCodec类中的方法。我们就以这个为例子看一下它是如何从C调用的java方法吧。...以上就是Signature表示方法的规则! 看看下面一些Signature,你能一个个转换为相应的方法吗?
:L+类全名,类名中的.用/代替,比如java.lang.String就是Ljava/lang/String; 如果是数组类型:则在前面加上然后加类型签名,几位数组就加几个,比如int[]->[I,boolean...目录下javac/debug 生成class文件,找到 类到地址 然后右键打开命令行 JNIEnv是native世界中Java环境的代表,通过JNIEnv *指针可以在native世界中访问Java世界代码操作...,它只在创建它的线程有效,不能跨线程传递,因此不同的是独立的 作用: 调用Java方法 操作Java(操作Java中的变量和对象等) 局部引用、全局引用与弱引用比较 和Java引用类型一样,JNI也有引用类型...JNI规范指出,任何实现JNI规范的JVM,必须确保每个本地函数至少可以创建16个局部引用(可以理解为虚拟机默认支持创建16个局部引用)。 局部引用不能跨线程使用,只在创建它的线程有效。...不要试图在一个线程中创建局部引用并存储到全局引用中,然后在另外一个线程中使用。 全局引用 全局引用:只能调用NewGlobalRef基于局部引用创建,会阻GC回收所引用的对象。可以跨方法、跨线程使用。
函数多参数方案 : 如果线程执行的函数有多个参数 , 可以使用结构体 , 类进行封装 ; 6. 线程属性 : 创建线程时 , 给线程指定属性 pthread_attr_t 是结构体类型 ; 7....指针 函数的返回值类型 void* 指针 函数多参数方案 : 如果线程执行的函数有多个参数 , 可以使用结构体 , 类进行封装 线程属性 : 创建线程时 , 给线程指定属性 pthread_attr_t...: 调用 JavaVM 的 AttachCurrentThread 方法 , 可以绑定线程 , 其传入一个 JNIEnv ** 二维指针 , 会返回该线程对应的 JNIEnv 指针 ; ④ 剥离线程...传递 int 类型 和 int * 类型 , 传递指针可以在 方法中修改 int 变量值 ; 传递 int * 类型 和 int ** 类型 , 传递二维指针 可以在方法中修改 int...使用域作用符访问全局的 ::obj 变量 ::obj = env->NewGlobalRef(instance); //代表一个线程的句柄 pthread_t pid;
注:Android develop中给的的编码建议是: 尽可能避免在使用受管理编程语言编写的代码与使用 C++ 编写的代码之间进行异步通信。这样可使 JNI 接口更易于维护。...例如,最好使用 Java 编程语言在两个线程之间进行回调(其中一个线程发出阻塞 C++ 调用,然后在阻塞调用完成时通知界面线程),而不是通过 JNI 从使用 Java 代码的界面线程调用 C++ 函数。...JNIEnv 与多线程 之前文章提到过JNIEnv是线程相关的,即在每一个线程中都有一个JNIEnv指针,每个JNIEnv都是线程专有的,其他线程不能使用本线程中的JNIEnv....一种比较常见的应用场景是:在native 层创建了线程,线程执行完后想将结果返回给java层,这时线程是不能用jni函数参数中的JNIEnv的,因为参数中的JNIEnv属于不同的线程....mObject = env->NewGlobalRef(weak_thiz); } 可以看到,在构造函数中调用了mObject = env->NewGlobalRef(weak_thiz);创建了对
对于没有做过嵌入式开发的人来说,也许很陌生,一些Android的开发,如果没有过多涉及JNI方面,也不太清楚什么是交叉编译,通俗来讲,交叉编译就是在一个平台上生成另外一个平台可以执行的代码。...创建一个包含native代码的工程,主要关注这两个结构: main目录下创建了cpp和java文件夹,cpp就是写native代码的,java就是上层代码,其中cpp文件夹下面有一个CMakeLists.txt...: (ILjava/lang/String;)I 例如我们定义了一个类VideoInfo,在包名com.jeffmony.video下面,那在JNI中其对应的是Lcom/jeffmony/video/...我们这边需要着重记住的就是JavaVM在一个进程中只存在一个,这个很重要,JNI多线程需要这个作为基础。...JNI多线程: 我们经常遇到的一个场景是,在JNI中可能会开启一个线程,如何回调到Java层来?
转载请以链接形式标明出处: 本文出自:103style的博客 本文操作以 Android Studio 3.5 版本为例 本文为参考官方示例 hello-jniCallback 动手写的 Demo...因为这个只需要执行一次就好了,我们可以放到JNI_OnLoad方法中去实现(在应用层调用.so库首先会执行 JNI_OnLoad 方法)。 获取内部类用 而不是 ....,例如: env->FindClass("com/lxk/ndkdemo/JniCallbackDemo 这里构建了一个结构体jniCallback保存获取的 类 和 实例。...= nullptr; return JNI_VERSION_1_6; } 创建线程执实现开始计时的逻辑: 通过pthread_create创建线程的时候,第一个参数:线程id的指针;第二个参数...:线程属性的指针;第一个参数:在线程中运行的函数;第四个参数:运行函数的参数 extern "C" JNIEXPORT void JNICALL Java_com_lxk_ndkdemo_JniCallbackDemo_startTiming
本篇介绍 在搞逆向的时候,Hook是个很必要的手段,通过Hook就可以了解内部的运行机制,甚至进行修改。...1.1.3 安装magisk magsik 可以看成是一个特殊的文件系统,可以提供root能力的同时又隐藏已被root的事实,这样一些防root的应用也可以在设备上正常使用了,和xposed的关系如下:...YAHFA:android art上的一个hook框架 看到这些介绍,现在就知道我们安装的那些zip,apk分别用来干啥了吧?...2 Module演示 接下来我们通过一个Demo演示下Xposed的能力,比如我们需要hook下微信,让微信显示我们自己定义的字符。 1.1 环境准备 首先创建一个工程,无Activity就行。...'de.robv.android.xposed:api:82:sources' 接下来新建一个类实现IXposedHookLoadPackage 接口,这儿就是hook的行为了,代码基本可以自解释:
你可能有这样的想法,我们把env存到本地不就可以了吗,答案是不可以,因为每一个Java线程都会有一个对应的env,我们在Native层无法感知到是哪一个Java线程,保存的env可能当时有效,换一个线程就会失效...JavaVM:Java虚拟机在Native层的代表,在Android中一个进程只有一个JavaVM,所有的线程共用一个JavaVM。...在Native环境中创建的线程,如果需要调用JNI方法,必须要调用AttachCurrentThread()与JVM进行关联,使用后也需要调用DetachCurrentThread()来解除关联。...小总结: 在Android进程中,在Native层,通过任何一个可用的JNIEnv都可以获取到整个进程唯一的JavaVM,在任何线程中都可以通过JavaVM获取当前线程可用的JNIEnv,如果是Native...方法二:通过JNIEnv获取JavaVM,在程序的最开始写一个类似于初始化功能的函数,传到Native层一个可用的JNIEnv,之后就可以获取到JavaVM。
全局引用作用域 : 与局部引用对比 : 全局引用与局部引用相对应 , 其作用域是全局的 , 局部引用只能在当前方法使用 ; 空间 : 可以 跨方法 , 跨线程使用 ; 时间 : 创建后可以使用 , 手动释放后全局引用失效...创建全局引用 ( NewGlobalRef ) ---- 1 ....函数原型 : 传入一个局部引用参数 , 将局部引用转为全局引用 ; 返回值 : 由局部引用转换成的全局引用 ; 参数 : jobject obj : 使用 NewXXX / FindXXX 等 大多数...跨方法 , 跨线程使用 时间 : 创建后可以使用 , 手动释放后全局引用失效 全局引用创建 : NewGlobalRef 全局引用释放...: DeleteGlobalRef 全局引用会阻止 JVM 回收该引用 这里注意域作用符的使用 , 本方法中没有 class_teacher_global 同名变量
, 注意子线程的 JNI 环境需要获取 , 主线程的 JNI 环境可以直接从 Native 层实现的 Java 方法中获取 ; ② jobject instance : 在 Native 层的 Java...主线程 JNIEnv *env 和 jobject instance 获取方法 : 这两个值都可以在 C++ 中实现的 native 方法中获取 ; extern "C" JNIEXPORT void...JavaVM *vm ---- JavaVM *vm 获取方法 : 在 JNI_OnLoad() 方法中获取 ; //JNI_OnLoad 中获取的 Java 虚拟机对象放在这里 JavaVM *javaVM...局部引用 与 全局引用 : JavaVM *vm , JNIEnv *env 与 jobject instance 是在方法中获取的 , 如果跨线程调用 , 就需要考虑其引用的类型 , 局部引用 或 全局引用...Native 调用 Java 方法 ( 主线程 ) ---- 主线程中可以直接使用 Native 方法中获取的 JNIEnv *env 调用 Java 方法 ; //主线程 : 可以直接使用
通过 android的JNI调用支付宝脱机认证库本地接口时,我欲返回一个类的实例,但是却报了几个错,最后查出来了原因。在此总结下。...的垃圾回收机制问题,新版本已经不允许全局使用findclass出来的局部引用了, 会被GC回收掉。...需要注意的地方是: static jclass myClass; ,一,需要把jclass声明为静态的 。二,注意这个地方,用NewGlobalRef把引用设为全局的。...cardDataLength:" + getCardDataLength() + "," + "errorCode:" + new Integer(getErrorCode()).toString(); } } 在android...,是注册的关键部分 static const JNINativeMethod gMethods[] = { {"qrcode_test", /* func2是在java中声明的native
可能就有大兄弟立马说:在nativeThreadEnvTest传入的env时NewGlobalRef啊,这样就可以全局使用了!这好像确实是一个解决思路,好像还蛮好使的(因为兄弟你见识得太少了)。但是!...每一个执行绪在呼叫native函数时,所传递进来的JNIEnv指标值都是不同的。...为了配合这种多执行绪的环境,C组件开发者在撰写native函数时,可藉由JNIEnv指标值之不同而避免执行绪的资料冲突问题,才能确保所写的native函数能安全地在Android的多执行绪VM里安全地执行...这里的JavaVM就是虚拟机VM在JNI中的表示,一个进程JVM中只有一个JavaVM对象,这个对象是线程共享的。...说到AttachCurrentThread,不能不提起JavaVM的另外一个接口 GetEnv,看上去GetEnv不就是获取env的方法吗?
简介 前面已经讲到如何在Linux环境下编译FFmpeg以及在Android项目中使用,这一节就开始真正的使用FFmpeg。在Android平台下用FFmepg解析视频文件并进行RTMP推流。...新增推流函数 异常处理 设置回调方法 常见问题 源码 新增推流函数 首先我们将所有FFmpeg的操作抽取到一个类里面,然后增加推流方法。...至于FFmpeg的使用,这里就不重复讲了,不懂的可以看之前的文章。源码见末尾 异常处理 在我们之前的推流代码中,并没有做异常处理。这样在正式的使用中肯定不太好的。所以我们加上try catch。...源码见末尾 设置回调方法 为了方便我们查看推流的信息,我们新增一个回调类。...,可以从文件中判断。
总结: JNI 是实现的目的,NDK 是 Android 中实现 JNI 的手段。 二、谈谈你对 JNIEnv 和 JavaVM 理解 JavaVM JavaVM 是虚拟机在 JNI 层的代表。...注意: 在 native 环境下创建的线程,要想和 java 通信,即需要获取一个 JNIEnv 对象。...三、解释一下 JNI 中全局引用和局部引用的区别和使用 全局引用 通过 NewGlobalRef 和 DeleteGlobalRef 方法创建和释放一个全局引用。...局部引用 通过 NewLocalRef 和 DeleteLocalRef 方法创建和释放一个局部引用。 局部引用只在创建它的 native 方法中有效,包括其调用的其它函数中有效。...五、怎么定位 NDK 中的问题和错误 一般在开发阶段的话,我们可以通过 log 来定位和分析问题。
在 Native 代码中有时候会接收 Java 传入的引用类型参数,有时候也会通过 NewObject 方法来创建一个 Java 的引用类型变量。...如果把 FindClass 函数创建的局部引用也通过 static 变量缓存起来,那么在函数退出后,局部引用被自动释放了,static 静态变量中存储的就是一个被释放后的内存地址,成为了一个野指针,再次调用时就会引起程序崩溃了...比如,通过局部引用创建了一个大对象,然后这个对象在函数中间就完成了任务,那么就可以早早地通过手动释放了,而不是等到函数的结尾才释放。...它们可以为局部引用创建一个指定数量内嵌的空间,在这个函数对之间的局部引用都会在这个空间内,直到释放后,所有的局部引用都会被释放掉,不用再担心每一个局部引用的释放问题了。...同时,对于工具类的 Native 函数,使用缓存技术来保存一些全局引用也是能够提高效率的,正如 Android JNI 调用时缓存字段和方法 ID 文章中写到的一样。
在上一节《C++11 JNI开发中RAII的应用(一)》中我们已经有了一些基本的RAII封装工具,本节就简单了,就是根据需要把一些常用的JNIEnv函数封装成更方便使用的模板函数。...raii_NewGlobalRef raii_NewGlobalRef函数顾名思义,就是封装JNIEnv::NewGlobalRef,将一个本地引用的jobject转为全局引用封装在raii_var中。...,则返回的raii_var类中的类型默认为jobject,否则 下面所有的模板函数都是这个用法。...jclass对象 raii_GetObjectClass raii_GetObjectClass封装JNIEnv::GetObjectClass,返回一个jobject的jclass对象 static...UTF-8编码的字符串转为java String(jstring) raii_NewStringUTF封装JNIEnv::NewString,将一个Unicode 编码的jchar数组转为java
领取专属 10元无门槛券
手把手带您无忧上云