草庐IT

check_jni

全部标签

JNI函数注册及SO加载原理

JNI方法注册方式分为动态与静态注册。1.函数静态注册1.1JNI层函数格式:Java_包名_类名_方法名下划线隔开,通过javah生成带签名的函数,然后去实现这些函数,这种也是官方推荐的方式。Java层方法声明成native方法:publicnativeStringsignture(Stringsig);JNI层对应的方法:JNIEXPORTjstringJNICALLJava_jni_chowen_com_nativeapp_MainActivity_signture(JNIEnv*env,jobjectjobject1,jstringjstring1){//md5加密constchar*

JNI库文件加载源码解析

下面我们结合源码详细探讨下JNI调用的库文件是如何加载的,为啥HelloWorld.so必须被命名成libHelloWorld.so,JNI_OnLoad方法是在什么时候回调的,返回的版本号有啥用?先看下总体的流程图Java源码解析System.loadLibrary和System.load方法System.loadLibrary(String)方法用来加载动态链接库的,String参数是指定动态链接库的模块名的而非真实的文件名的。System还有另外一个load(String)方法,也是用来加载动态链接库的,不过String参数是库文件的绝对路径名,比如上述示例中的System.loadLi

swift - Xcode 7.3, swift 2.2 : default initialiser selector (new compile-time check)

我正在将一些选择器迁移到Swift2.2,但我遇到了其中一个问题:代码:lethook=ARTRealtimePresenceQuery.testSuite_injectIntoClassMethod("init"){//DefaultinitialiserpresenceQueryWasCreated=true}现在,Xcode想帮助我进行转换,但方式不对:代码:lethook=ARTRealtimePresenceQuery.testSuite_injectIntoClassMethod(#selector(_NSEnumeratorType.init)){//Defaultini

JNI和字节码方法调用

Java对象创建的本质就是按照对象的大小分配一块内存,然后完成属性的初始化。对象创建完了,接着干啥了?调用Java方法完成特定功能。这就是我们接下来探讨的主题,Java方法调用是怎么实现的。一、Main方法main方法是Java应用启动执行的入口方法,这个方法是怎么执行的了?,关键代码在OpenJDKjdk/src/share/bin/java.c中的intJNICALLJavaMain(void*_args)方法,如下图:image.png即main方法是通过JNI的CallStaticVoidMethod方法执行的。二、JNI方法调用1、API定义JNI的方法调用的API,分为三种,总结如

nacos项目启动出现的bug Server check fail, please check server localhost ,port 9848 is available

启动nacos的时候发现客户端报错了[main]c.a.n.c.remote.client.grpc.GrpcClient  :Servercheckfail,pleasecheckserverlocalhost,port9848isavailable,error={}java.util.concurrent.TimeoutException:Waited3000milliseconds(plus15milliseconds,118500nanosecondsdelay)forcom.alibaba.nacos.shaded.io.grpc.stub.ClientCalls$GrpcFutur

Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

1.首先认识一下NDK。(1)什么是NDK?NDK全称是NativeDevelopmentKit,NDK提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。(2)为什么使用NDK?1)代码的保护:由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。2)可以方便地使用现存的开源库:大部分现存的开源库都是用C/

iOS Swift : how to check if Object exists in an Array so I don't add it to it, 或用它重新创建 GMSMarker?

我一直在为iOSsdk使用gmaps并遇到这个问题:每次map平移或缩放时并完成(我使用的是委托(delegate)idleAtCameraPosition)在我的服务器端我比较map中心的坐标,以便标记它周围的地方。当它们距离中心坐标足够近(1公里)时,我将这些位置保存在“位置”对象数组中。我的问题是我无法避免将重复的对象添加到数组中,所以每次我平移map但不改变相机位置时,屏幕上的现有标记都会重新显示添加到Places数组。我尝试使用此代码,但它不起作用并且数组可以无限增长直到应用程序崩溃:if(!arrayProp.contains(place)){arrayProp.appen

android jni层 opencv读写视频,基于VideoCapture和VideoWriter

开始用正常c++的opencv代码,包括python代码,也都是直接用VideoCapture,在open后面加videofile就可以了 //readvideocv::VideoCapturecapture;capture.open("/storage/emulated/0/DCIM/test.mp4");但是在androidjni层无论读写视频,capture.open那里都会报错E/cv::error():OpenCV(4.6.0)Error:Requestedobjectwasnotfound(couldnotopendirectory:/data/app/~~sbu7r1TB_QJQ

Android JNI打印logcat日志

在JNI中打印日志可以使用__android_log_print函数来实现。该函数是AndroidNDK提供的一个用于在本地代码中输出日志消息到logcat的方法。要在JNI中打印日志,请按照以下步骤进行操作:在你的JNIC/C++代码中包含头文件:#include使用__android_log_print函数来打印日志。它的原型定义如下:__android_log_print(intpriority,constchar*tag,constchar*format,...)priority:日志的优先级,可以是ANDROID_LOG_VERBOSE、ANDROID_LOG_DEBUG、ANDRO

iOS swift : Check string suffix

我有一个字符串数组,它们是我的应用程序包中的文件名。有些是PNG,有些是MOV。Swift中有没有检查字符串后缀的好方法? 最佳答案 使用hasSuffix和filter方法,如下所示:letfiles:[String]=["quick.txt","brown.mov","fox.exe","jumps.mov","over.jpg","the.txt","lazy.mov","dog.opt"]letmovs=files.filter{$0.hasSuffix(".mov")}println(movs)//Prints[brown