- 博客(126)
- 资源 (19)
- 收藏
- 关注
原创 Android JNI使用dlopen动态链接库
具体来说,dlopen 函数可以接受一个共享库的路径作为参数,并返回一个句柄(handle),该句柄用于后续操作,例如通过 dlsym 获取库中的函数地址,以及通过 dlclose 关闭已加载的库。在 Android 开发中,dlopen 通常与 JNI(Java Native Interface)一起使用,以便在 C/C++ 层加载第三方库,并在 Java 层中调用这些库中的函数。它的主要作用是在程序运行时动态地加载共享库,使得程序可以在不重新编译的情况下加载并使用库中的函数和变量。
2024-04-17 17:45:55 402
原创 dlopen failed: library “libsdrv-shm.so“ not found: needed by
日志看是App找不到对应的库,但是在/vendor/lib64目录下找到了libsdrv-shm.so,一番尝试后发现是因为权限问题,可以将目标so添加进白名单,在对应文件中添加需要依赖的库重启生效。JNI开发接入第三方动态库运行出错。
2024-03-29 17:07:11 102
原创 Android JNI开发定义全局变量
在C++中,如果你希望在多个源文件中共享同一个全局变量,你需要在其中一个源文件中进行定义,而其他源文件则需要对该全局变量进行声明。这样,其他源文件就可以通过包含 common.h 头文件来访问这个全局变量了。要在 C++ 文件中设置一个 string 类型的全局变量,让其他 C++ 文件都可以访问,并且可以通过 JNI 方法修改这个变量,可以按照以下步骤进行操作。在一个 C++ 文件中实现全局变量: 在一个 C++ 文件中实现这个全局变量,并提供一个 JNI 方法来修改这个全局 string 变量。
2024-03-28 19:35:49 523
原创 Android CMakeLists.txt不同渠道加载对应目录动态库
要在 Android JNI 开发中的 CMakeLists.txt 文件中根据不同渠道加载不同的动态库,可以通过在 build.gradle 中定义 productFlavors,并为每个 flavor 指定不同的 CMake 变量,然后在 CMakeLists.txt 中根据这些变量来加载对应的动态库。根据 FLAVOR1 和 FLAVOR2 变量的设置,选择加载不同的 native-lib 动态库。2. 在 CMakeLists.txt 文件中,可以根据这些变量来选择加载不同的动态库。
2024-03-28 14:54:22 537
原创 Android 子module添加渠道配置异常
检查后发现是主module和子module的flavorDimensions配置不一致导致,flavorDimensions允许你在定义多个产品风味时,将它们分组到不同的维度中。这样可以使得每个产品风味只能选择一个维度进行组合,而不会出现混乱或冲突的情况。
2024-03-28 11:33:32 625
原创 Chrome安装Axure插件
打开原型目录/resources/chrome,重命名axure-chrome-extension.crx,修改后缀为rar,axure-chrome-extension.rar解压到axure-chrome-extension目录打开Chrome,更多工具->扩展程序,打开开发者模式,选择加载已解压的扩展程序,即可完成安装
2024-03-07 18:53:48 511
原创 使用DialogFragment实现自定义视图
要使用 DialogFragment 实现一个自定义的包含自定义视图的对话框,可以创建一个布局文件来定义您想要显示的自定义视图,然后在DialogFragment 中加载该布局文件并显示出来。在需要显示自定义视图对话框的地方(如 Activity 中),通过创建并显示 CustomViewDialogFragment 实例来呈现对话框。首先,创建一个 XML 布局文件(例如 custom_dialog_layout.xml),用于定义自定义的对话框视图。
2024-03-06 16:50:06 198
原创 Android使用AtomicReference
AtomicReference 是 Java 中用来提供原子操作的类之一,它可以在多线程环境下安全地对对象引用进行读取和更新操作。在这个示例中,我们创建了一个 AtomicReference 对象 atomicReference,并使用 set 方法在多个线程中同时修改参数的值。然后使用 get 方法获取最终的参数值,并打印出来。通过使用 AtomicReference,我们可以确保对对象引用的操作是线程安全的,从而避免在多线程环境下出现竞态条件和不一致性的问题。
2024-02-29 10:16:57 240
原创 Python使用CBC加密模式进行AES加密
我们首先使用 Cipher 类来创建一个 AES 密码器对象,指定所需的 AES 算法、CBC 加密模式和密钥。然后,我们获取密码器的加密器,并使用 PKCS7 填充方式创建一个填充器对象。我们使用填充器对明文进行填充,得到经过填充的明文。请注意,在使用 CBC 模式时,需要确保密钥和初始向量在加密和解密过程中是一致的。同样,确保在 Android 和 Python 中使用相同的密钥格式、字符编码、填充方式和初始向量,以确保生成的加密结果一致。接下来,我们使用加密器对填充后的明文进行加密,得到密文。
2024-01-22 20:13:02 472
原创 Binder通信权限校验
在 onBind() 方法中使用 checkCallingOrSelfPermission() 方法来检查客户端是否具有 CUSTOM_PERMISSION 自定义权限。如果客户端没有该权限,则返回 null,否则返回服务的 IBinder 对象。在客户端的清单文件(AndroidManifest.xml)中定义自定义权限。
2024-01-18 14:57:58 354
原创 Android 自定义权限
在 Android 项目的清单文件(AndroidManifest.xml)中,找到 标签,并在标签内部添加一个 元素。该元素用于定义自定义权限的名称、保护级别和其他属性。android:protectionLevel 是在 Android 清单文件中 元素中用于指定权限保护级别的属性。它决定了应用程序访问敏感资源或执行敏感操作时对权限的要求和限制。需要授予或检查自定义权限的组件(如活动、服务、接收器等)中,使用 元素声明对自定义权限的依赖。
2024-01-18 14:48:58 715
原创 Android在系统界面上添加窗口
然后创建了一个自定义的MyView对象,作为要添加的窗口的内容。接下来,创建了WindowManager.LayoutParams对象,用于指定窗口的各种属性,比如宽度、高度、位置等。最后,通过windowManager.addView()方法将自定义的View添加到WindowManager中,从而将其显示在屏幕上。WindowManager.addView()是Android中的一个方法,用于在屏幕上添加一个窗口。它允许你在应用程序的上下文之外创建一个窗口,并将其显示在其他应用程序或系统界面上。
2024-01-17 14:22:50 785
原创 Android修改Spinner默认文字颜色
在上述代码中,我们通过找到android.R.id.text1来获取Spinner的默认TextView,并设置其文字颜色为红色。要修改Spinner(下拉选择框)的默认文字颜色,你可以使用自定义的Spinner适配器,并重写getView()方法来设置文字颜色。通过以上步骤,你可以修改Spinner的默认文字颜色。如果你想进一步自定义Spinner的样式,还可以创建自定义的Spinner样式。在代码中,我们创建了CustomSpinnerAdapter,并将其设置为Spinner的适配器。
2024-01-11 20:13:36 747
原创 adb forward使用
adb forward是Android Debug Bridge(ADB)的一个命令,它可以将设备端口和主机端口之间建立一个转发通道,从而使主机可以通过该通道访问设备端口提供的服务。使用adb forward可以方便地进行端口转发,例如在电脑上运行的应用程序需要与设备上运行的服务进行通信时。需要注意的是,如果在转发期间遇到任何问题,可以通过执行adb forward --list命令来查看当前的端口转发列表。其中,表示主机端口,表示设备端口。其中,表示要取消的主机端口。将设备端口转发到主机端口。
2024-01-10 16:44:13 1032
原创 Android集成OpenSSL实现加解密-集成
将编译生成的 OpenSSL 动态库文件(.so 文件)复制到你的 Android 项目的 libs 目录中。build.gradle添加配置。修改CMakeLists.txt。
2023-12-28 16:51:59 775
原创 Android集成OpenSSL实现加解密-编译
这里的 android-arm 可根据你的需要选择不同的目标平台和架构,例如 android-arm64、android-x86 等。--prefix 参数是指定 OpenSSL 编译输出的目录,目录建议提前新建。前往 OpenSSL 官方网站(https://www.openssl.org/source/)下载最新的源码压缩包并解压,示例在WSL环境编译。前往https://developer.android.google.cn/ndk/downloads?hl=zh-cn下载NDK版本并解压。
2023-12-28 16:43:36 995
原创 Android实现获取和修改prop属性
在 Android 中可以使用反射来调用 SystemProperties 类中的 get() 和 set() 方法来获取和修改 prop 属性。
2023-12-27 10:48:51 917
原创 Android获取文件列表并排序
使用 Arrays.sort() 方法对文件数组进行排序。sort() 方法接受一个比较器(Comparator)作为参数,这里使用了 Lambda 表达式来实现比较器。Lambda 表达式的内容定义了如何比较两个文件的最后修改时间。如果第一个文件的最后修改时间更晚,则返回 1;如果第二个文件的最后修改时间更晚,则返回 -1;如果它们的最后修改时间相同,则返回 0。这段代码的作用是对指定目录下的文件按照最后修改时间进行降序排序。
2023-12-27 10:26:09 484
原创 工作中常用的工具
WinSCP 是一款开源的 Windows 平台下的 SFTP、FTP、WebDAV 和 SCP 客户端软件,它允许用户在本地计算机和远程服务器之间传输文件和目录。scrcpy 是一个免费、开源的 Android 设备投屏工具,它可以让你在电脑上显示并控制连接到计算机的 Android 设备。WinMerge 是一款 Windows 系统下的免费开源的文件比较/合并工具,它可以比较两个文件夹和文件,以一种易于理解和处理的可视文本格式呈现差异。
2023-12-27 10:15:18 367
原创 Android 获取wlan0地址
通过 getIPAddress 方法传入接口名称(这里是 “wlan0”)来获取相应接口的 IP 地址。使用 NetworkInterface.getNetworkInterfaces() 获取所有网络接口,并循环遍历找到指定名称的接口。然后获取该接口的所有地址,并找到非回环地址且地址长度为 4 的 IPv4 地址。
2023-12-26 15:02:30 628
原创 使用ZMQ.proxy实现ZMQ PUB消息转发
然后使用 zmq.proxy 方法将前端套接字的消息转发到后端套接字。最后在 finally 块中关闭套接字和上下文。创建两个 ZMQ.Socket 对象:一个作为前端套接字(frontend socket),另一个作为后端套接字(backend socket)。前端套接字接收来自客户端的消息,后端套接字将消息转发给服务端。它可以将消息从一个套接字传递到另一个套接字,实现消息的转发和路由。调用 ZMQ.proxy 方法:将前端套接字、后端套接字作为参数传递给 ZMQ.proxy 方法,以启动代理服务器。
2023-12-26 11:35:54 763
原创 DevEco Studio Preview失败
点击File->Settings->Build, Execution, Deployment->Build Tools->Hvigor,取消勾选最后一项。安装DevEco Studio新建第一个项目后,点击Previewer预览失败,Preview failed。最后Build-> Clean Project,预览成功。
2023-12-20 12:15:41 2780 1
原创 Android共享元素动画
在目标 Activity 的 onCreate() 方法中,我们首先通过 supportStartPostponedEnterTransition() 方法来启动转场动画过渡。在 onTransitionEnd() 方法中,您可以执行动画结束后需要的操作。首先,在布局文件中定义两个界面的 SurfaceView,并为它们设置相同的 android:transitionName 属性。在源 Activity 中,当用户启动目标 Activity,并设置共享元素动画。
2023-12-12 18:06:10 339
原创 ReadTimeoutError: HTTPSConnectionPool(host=‘files.pythonhosted.org‘, port=443): Read timed out.
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com。pip install 出错。临时解决方法,修改PIP源。
2023-11-17 14:32:30 71
原创 Windows环境VSCode配置OpenCV-项目配置(二)
修改c_cpp_properties.json。需要修改mingw64的环境变量到git前。修改tasks.json。新建test.cpp。
2023-11-16 20:11:39 290
原创 Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported
【代码】Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported。
2023-11-14 18:55:27 452
原创 Android 重启App
在上述代码中,我们首先获取应用程序的启动意图(launch intent)并将其封装为 makeRestartActivityTask 意图。然后,我们创建一个 PendingIntent 对象,使用 set 方法设置重启延迟时间(这里设置为 1 秒),并将其与 AlarmManager 关联。最后,我们调用 System.exit(0) 来完全退出当前应用程序。要重启 Android 应用程序,可以使用 PendingIntent 和 AlarmManager 来实现。
2023-11-02 19:35:48 622
原创 Android ActivityLifecycleCallback使用
通过实现 ActivityLifecycleCallbacks 接口,可以在 Activity 的创建、启动、暂停、恢复、停止和销毁等各个阶段执行相应的操作。需要注意的是,ActivityLifecycleCallbacks 是 API Level 14 (Android 4.0) 引入的功能,因此在使用时要确保目标设备的最低 API 等级满足要求。应用程序将会在每个 Activity 的生命周期事件发生时调用相应的回调方法,以便根据需要执行特定的操作,例如记录日志、收集统计数据或执行其他自定义逻辑。
2023-11-02 09:00:00 333
原创 Kotlin this和it的使用区别
在这个示例中,我们定义了一个名为 MyClass 的类,并在 printValue 方法中使用了 this 关键字。在这个示例中,我们定义了一个名为 list 的列表,并使用 forEach 函数遍历列表。在 Lambda 表达式中,it 关键字引用接受 Lambda 参数的对象。在 Lambda 表达式中,this 关键字引用包含该 Lambda 的类实例。在 Kotlin 中,this 和 it 是两个关键字,用于引用不同的对象。在类或对象中,this 关键字引用当前对象本身。
2023-11-01 09:00:00 481
原创 Kotlin apply和with用法和区别
上面的示例中,我们使用 apply 函数修改了现有的 person 对象的属性。这个函数接受一个 lambda 表达式作为参数,该 lambda 表达式被应用于调用 apply 的对象,并可以在 lambda 中对对象进行任何操作。with 函数的第一个参数是一个对象,并且该对象将成为 lambda 表达式内部的上下文对象。apply 函数的作用对象是调用 apply 函数的对象本身。apply 是 Kotlin 标准库中的一个函数,它允许你在对象上执行一系列操作,然后返回该对象自身。
2023-10-31 16:08:07 1025
原创 Android Path.quadTo() 方法绘制二次贝塞尔曲线
在上面的代码中,我们创建了一个自定义的 View,并在构造函数中初始化了画笔和路径。我们使用 Path.moveTo() 方法将当前点移动到起始点 (100, 100),然后使用 Path.quadTo() 方法绘制了一条二次贝塞尔曲线,控制点的坐标为 (200, 50),终点的坐标为 (300, 100)。在 Android 中,可以使用 Path.quadTo() 方法绘制二次贝塞尔曲线。然后我们重写了 onDraw() 方法,在其中使用 Canvas 的 drawPath() 方法绘制了路径。
2023-10-31 09:00:00 389
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人