首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在JNI C中检查android设备上是否安装了包

在JNI C中检查Android设备上是否安装了包,可以通过以下步骤实现:

  1. 获取应用包管理器对象:使用AAssetManager_fromJava()函数获取Java层的AssetManager对象,并将其转换为C层的AAssetManager对象。
  2. 获取应用包名:使用AAssetManager_open()函数打开应用的AndroidManifest.xml文件,并通过解析该文件获取应用的包名。
  3. 检查应用是否安装:使用pm_getPackageInfo()函数,传入应用包名和标志位GET_PACKAGE_INFO_FLAG_META_DATA,获取应用的包信息。如果返回值为0,则表示应用已安装;否则,表示应用未安装。

以下是一个示例代码:

代码语言:txt
复制
#include <jni.h>
#include <android/asset_manager_jni.h>
#include <android/log.h>
#include <sys/system_properties.h>

JNIEXPORT jboolean JNICALL
Java_com_example_example_MainActivity_isPackageInstalled(JNIEnv *env, jobject instance,
                                                         jobject assetManager) {
    AAssetManager *aAssetManager = AAssetManager_fromJava(env, assetManager);

    // 获取应用包名
    AAsset *manifestAsset = AAssetManager_open(aAssetManager, "AndroidManifest.xml", AASSET_MODE_BUFFER);
    off_t manifestSize = AAsset_getLength(manifestAsset);
    char *manifestData = (char *) malloc(manifestSize + 1);
    AAsset_read(manifestAsset, manifestData, manifestSize);
    manifestData[manifestSize] = '\0';

    const char *packageName = strstr(manifestData, "package=\"");
    if (packageName != NULL) {
        packageName += strlen("package=\"");
        char *end = strchr(packageName, '\"');
        if (end != NULL) {
            *end = '\0';
        }
    }

    AAsset_close(manifestAsset);
    free(manifestData);

    // 检查应用是否安装
    jclass packageManagerClass = (*env)->FindClass(env, "android/content/pm/PackageManager");
    jmethodID getPackageInfoMethod = (*env)->GetMethodID(env, packageManagerClass, "getPackageInfo",
                                                         "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
    jobject packageManager = (*env)->CallObjectMethod(env, instance, getPackageManagerMethod);
    jobject packageInfo = (*env)->CallObjectMethod(env, packageManager, getPackageInfoMethod,
                                                   (*env)->NewStringUTF(env, packageName),
                                                   GET_PACKAGE_INFO_FLAG_META_DATA);

    jboolean isInstalled = (packageInfo != NULL) ? JNI_TRUE : JNI_FALSE;

    return isInstalled;
}

这段代码可以在JNI层检查Android设备上是否安装了指定的包。你可以将其集成到你的Android项目中,并在Java层调用该JNI方法。

请注意,以上代码仅为示例,具体实现可能需要根据你的项目需求进行调整。此外,还需要在AndroidManifest.xml文件中添加相应的权限,以便访问应用包信息。

推荐的腾讯云相关产品:腾讯云移动应用分析(https://cloud.tencent.com/product/mga)

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android新增LED设备--从底层到上层理解卓架构

Android系统架构如下: 阅读Android源码: http://androidxref.com/ 为了更好的理解卓的层次关系,本文RK3399的卓系统增加LED灯的外设,并使用APP打开关闭...Linux下的驱动是使用C语言进行开发的,可分为三类设备类型:字符设备,块设备,网络设备。每种类型的驱动都有他自有的驱动框架,学习驱动开发就是要熟悉各种驱动架构,并根据实际需求框架内添加内容。...mmm external/gpioleds_test/ 完成目录下生成二进制文件gpioleds_test。拷贝进设备。 4)测试 二进制文件拷贝进设备后,赋予777权限,然后运行。...设备的/system/lib/hw路径下,android frameworksJNI调用led设备时,通过一系列转换就会调用到这个库内部的函数,从而调动掉底层的led驱动。...3.frameworks/base/services/core/jni/Android.mk LOCAL_SRC_FILES变量增加一行 LOCAL_SRC_FILES += \ ……

2.7K20

Android IO监控 | 性能监控系列

背景 公司的一款app最近在上架厂商的过程,被对方指出了IO读写过于频繁,然后不给架。...另外Epic也可以做到的动态Hook, ,而听说腾讯的IOCanary则是参考了爱奇艺的xHook的原理。...的c++代码,我们只要简单的把几个proxy方法的线程检查逻辑屏蔽掉即可。...Close的时候才会将JavaContext对象上报,其中才会有内存的堆栈,但是我们实际的测试中发现,高版本的设备xHook的IO close操作并没有被很好的触发,这块我真的不是特别擅长,所以我们构造的时候就对堆栈进行了打印...大小计算调整 由于实际开发,我们碰到了很多设备由于Close函数没有触发,导致了IO监控数据不准确的问题。我们write函数增加了额外的jni调用。

2.6K22
  • 手把手教你分析 Android 系统启动流程

    手把手教你分析 Linux 启动流程 Andorid 系统是嵌入式行业中广泛应用的系统,手机、平板、机器人、汽车控系统都有使用卓系统的,应用方面的优势是卓系统自带 UI,使用 Linux 需要自己用...Android 系统启动流程如下: 1)Boot ROM 是固化硬件的一段代码,它一般是固定的,它的作用是检测基本的硬件是否存在,比如检测 EMMC 是否存在,存在的话,把 bootloader...2、app 的 java 语言调用 JNI 文件,JNI 调用 C 语言, C 函数中去操作节点。...如果你有 root 权限,那么你可以卓系统命令行输入 setenforce 0 来关闭Android 系统的 SELinux 检查机制,那基本你所有操作都可以被允许。... Andorid 系统,安全机制是:不管你是谁,做任何事情都要提前申请,否则会被 SELinux 检查,没有提前申请的行为都会被拒绝,看 log 会发现很多 avc deny。

    94410

    App自动化测试|Appium工作原理及Desired Capbilities配置

    ,是一系列的键值对,遵循W3C WebDriver Spec设计风格;appium的Json wire protocol继承自selenium的webdriver wire protocol,并进行了扩展...bootstrap:bootstrapappium是以jar的形式存在的,它的功能是作为一个socket服务,把Appium sever发送的请求转化成uiautomator的命令来让uiautomator...创建session成功之前,appium就已将bootstrap.jar放入手机,并开启设备的基于appiumbootstrap的socket服务,绑定本机和boostrap通信的端口号4724用于和...Appium将其安装到合适的设备。如果指定了appPackage和appActivity参数,Android则不需要此参数了。该参数也与browserName不兼容。...':'huawei', # 填写卓虚拟机/真机的设备名称 'appPackage':'com.sky.jisuanji', # 填写被测app名 'appActivity

    2.5K10

    动态下发 so 库 Android APK 安装瘦身方面的应用

    考虑到检查带来的时间成本,可以假设内部路径是无条件可信的(对 Android 来说, data/data 路径设备 root 情况下是不安全的;而且除了劫持风险外,内部路径文件有可能被应用自身一些不当文件操作给破坏导致插件不完整...flag 标志是否存在来决定是否需要执行安全检查。...Android Keystore 进行签名,将 Keystore 的指纹信息保存在宿主内部,安全检验环节只需要校验插件的签名信息是否和内置的指纹信息一致即可。...(一种优化的方案是,使用和宿主一样的 Keystore 给插件签名,检验环节只需要检查插件和宿主的签名信息是否一致。)...3. abi 兼容性判断 abi 兼容性是 so 插件特有的动态化问题,除了考虑 so 插件是否安全之外,我们还需要检查 so 插件里的 so 库 abi 信息是否与宿主目前运行时的 abi 一致。

    8.9K74

    android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此andrid自由使用 图像匹配、识别、检测

    也就是说,我必须要调用它里面的函数再结合自己算法重新去实现这样一个功能,再使用 ndk 环境去实现 jni 编程,把我自己写好的 c++ 代码,在生成 .so 动态库的基础,引入并使用。        ...现在打开 sdk/native/jni,如无意外,里面肯定有个 文件叫做 OpenCV.mk,它就是我们 android.mk 脚本文件要引入 opencv C++库所要参照的文件。...这里是你的名; 6,MyActivity 你的类名,要引用这个这里C++函数的类名; 7,ImgFun  是你要在java调用的函数名字,哪些不用直接被调用的,不用写; 8,JNIEnv*...你可以 as 的 cmd 或者 系统的 cmd框实现编译,首先使用命令进入到当前的 jni 文件夹的 目录,例如,我的是  D:asproject/JniDemo/app/main/jni,然后使用命令...出现的原因:      原来是这样的,android studio 我们编译完 .so 文件后,我们Android.mk 文件设置引入的opencv 函数库,是已经被编译进去.so 动态库里面了的

    5.6K50

    JNI开发,你需要知道的一些建议

    它们本质都是指向函数表指针的指针(C++版本,它们被定义为类,该类包含一个指向函数表的指针,以及一系列可以通过这个函数表间接地访问对应的JNI函数的成员函数)。...理论可以一个进程拥有多个JavaVM对象,但Android只允许存在一个。 JNIEnv提供了大部分JNI功能。使用者定义的所有Native函数都会接收JNIEnv作为第一个参数。...检查isCopy标识的一个原因是对一个数组做出变更后确认你是否需要传入JNI_COMMIT来调用Release函数。...使用adb shell ls -l 检查它的存在性和权限。 库文件不是用NDK构建的。这就导致设备并不存在它所依赖的函数或者库。...签名类名组件是以“L”开头的,以“;”结束的,使用“/”来分隔名/类名,使用“Entry;)。 使用javah来自动生成JNI头文件也许能帮助使用者避免这些问题。

    1.4K30

    Android_其他语言交互篇——Js、C#、CC++

    端 题外话 C#——Unity3D 调用方式 实现 CC++——JNI 准备工作 新项目处理方法 已有项目处理方法 调用 1 前言 Android开发我们有很多时候要与其他语言进行交互,然而对于小白来说学习卓就够头疼的了更不用说其他的语言了...然而它也有它的缺点:lib神奇的庞大,动辄几十兆,额......不过我猜想是否可以用热更新的方式来引导用户载入这个组件(目前还未实际测试),这里贴一下CrossWalk的官网及仓库地址,有兴趣的朋友可以研究下...很小白以为JNI卓搞出来的,其实这玩意跟卓没毛线关系,人家是Java1.1就引入的东东,JNI全称Java Native Interface(Java原生接口),它提供了若干的Api实现了Java...Android调用JNI native方法JNI文件的代码实现(C++和C的代码还是略微不同的,下图分别贴出做下比较,其实.cpp文件是既可以编写C++代码又可以编写C代码的): ?...Android调用JNI JNI文件调用.java文件的方法,一般分为3部: 1、首先反射拿到我们需要调用的类,注意的 .

    2.2K20

    Android平台OCR工具之Tess-two的编译

    1.Tesseract简介 Tesseract是Ray Smith于1985到1995年间惠普布里斯托实验室开发的一个OCR引擎,曾经1995 UNLV精确度测试名列前茅。...主页地址:https://github.com/tesseract-ocr Tesseract的主页,我们可以下载到Tesseract的源码及语言,常用的语言为 中文:chi-sim.traineddata...英文:eng.traineddata 2.Tess-two 因为Tesseract使用C++实现的,Android不能直接使用,需要封装JavaAPI才能在Android平台中进行调用,这里我们直接使用...-9 APP_CPPFLAGS += -fexceptions -frtti NDK_TOOLCHAIN_VERSION := clang 我卓开发过程APP_ABI := 后面只保留了 armeabi...数据必须复制到设备子目录命名为tessdata. tess-two下载(Tesseract 3.05、Leptonica 1.74.1、libjpeg 9b、libpng 1.6.25)

    1.1K40

    Android平台OCR工具之Tess-two的编译

    1.Tesseract简介 Tesseract是Ray Smith于1985到1995年间惠普布里斯托实验室开发的一个OCR引擎,曾经1995 UNLV精确度测试名列前茅。...主页地址:https://github.com/tesseract-ocr Tesseract的主页,我们可以下载到Tesseract的源码及语言,常用的语言为 中文:chi-sim.traineddata...英文:eng.traineddata 2.Tess-two 因为Tesseract使用C++实现的,Android不能直接使用,需要封装JavaAPI才能在Android平台中进行调用,这里我们直接使用...-9APP_CPPFLAGS += -fexceptions -frttiNDK_TOOLCHAIN_VERSION := clang 我卓开发过程APP_ABI := 后面只保留了 armeabi...数据必须复制到设备子目录命名为tessdata. tess-two下载(Tesseract 3.05、Leptonica 1.74.1、libjpeg 9b、libpng 1.6.25)

    89420

    我的非线性视频编辑器MiaoVideoCut(1) --- 视频基础知识及环境搭建

    JNI是java调用Native语言的一种特性, JNI属于java,与android无直接关系 1.2实现步骤 1.Java声明Native方法(即需要调用的本地(c++)...作用:快速开发CC++的动态库,并自动将so的应用一起打包成APK,即 可以通过NDKAndroid中使用JNI与本地代码(如CC++)交互 NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序...android studio,通过NDK从而实现JNI的功能 其他解释: NDK是一个工具集,允许你的App使用一些底层语言代码,例如CC++。...配置好NDK后的样子,需要根据需求修改C++文件 & Android (3)NDK和JNI的关系 1.JNI是实现的方法,NDK是android实现JNI的手段。...即,android studio,通过NDK来实现JNI功能 4.建git仓库 5.把ffmapeg编译到卓平台上(坑较多) 作业 把ffmapeg编译到卓平台上流程理解

    1.2K40

    android调用C语言实现内存的读取与修改的方法示例

    写之前需要准备以下内容 android studio 已ROOT设备 GG修改器 打开android studio,创建Native C++ Project ?...O_WRONLY只写打开 O_RDWR可读可写打开 O_SYNC以同步的方式打开文件 C++核心代码 #include <jni.h #include <string #include <stdio.h..._mem(fd, &buf[0], 4, addr); //写入内存数据 //pread64_mem(fd, &base, 4, addr); return pid; } C代码需要自行修改的地方...char *game = “com.tencent.tmgp.sgame”; //名 long *addr = (long *) 0x12C0085C;//内存地址 效果图链接:yuanma/men_jb51....rar 以上是简单的内存地址修改方法,到此这篇关于android调用C语言实现内存的读取与修改的方法示例的文章就介绍到这了,更多相关android调用C语言实现内存读取修改内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持

    1.7K20

    DuerOS 应用实战示例——机器狗DIY

    专辑《DuerOS 的AI 实战》的《一个卓App,如何成为DuerOS 的技能应用呢?》...| New | New Project 选择Native C++ 找到jni的文件夹的 SerialPort.c和SerialPort.h文件复制到\app\src\main\cpp文件夹...设备启动apk: adb shell am start com.abel.myserial/.MainActivity 启动logcat,查看输出日志, serial_port 代表了c 语言的输出日志...2)查看 android 设备,到底写了哪个串口,是否可以输出内容到Mac ? 鉴于只有一个 usb到Type-C 的转接头,采用ADB 的wifi 连接,然后设备的飞线串口连接我的mac。...5.1 支持语音交互的Bot 服务 DBP 平台创建apk 技能:随身机器狗,得到bot-id:f5069014-39e4-1e4c-9642-65d23a11adf1,名:com.dueros.xgo

    1K20

    Android Studio 3.2新功能特性

    系统跟踪 CPU profiler,选择新的 System Trace 配置以检查设备的系统CPU和线程活动。...检查内存分析器JNI引用 如果您将应用部署到运行Android 8.0(API级别26)或更高级别的设备,则现在可以使用Memory Profiler检查应用的JNI代码的内存分配情况 。...您的应用程序运行时,选择您想要检查的部分时间轴,然后从班级列表上方的下拉菜单中选择 JNI heap,然后,您可以像平常一样检查的对象,然后“ Allocation Call Stack ”选项卡双击对象以查看...改进现有的lint检查 Android Studio 3.2含对现有lint检查的许多改进。例如,资源循环检查现在适用于其他资源类型,并且翻译检测器现在可以在编辑器即时查找缺失的翻译。...安全重构: IDE内置的重构工具现在还可以检查是否重命名或删除了CMake构建脚本引用的文件。

    5.4K10

    2018年的卓开发环境搭建

    设置环境变量 其实这一步不算必须的,如果你感觉你C盘够大的话。就我个人体验,我的240G固态已经不能满足需求了,前几天满了我还不得不重装了一次系统(下次买硬盘一定要买1T的固态)。...有代理的同学直接设置一下代理就完事了,如果没有代理,可以AS安装目录寻找bin/idea.properties文件,然后最后添加下面一行,应该就可以直接打开了。...我出现的错误是找不到下载目录,仔细检查后发现,AS会尝试下载到以前的用户临时文件夹,但是我用户名改过了,所以就出错了。我的解决办法是把原来的SDK全删了重新下载一次。...如果电脑同时安装了Visual Studio,应该也会同时安装Lucida Sans Typewriter字体,也很美观。...所以最好只自己电脑开启USB调试,公共场合不要开启。 手机准备就绪之后点击Run -> Run app,就会打开设备列表对话框,同时在手机上提示是否允许USB连接。

    1.7K20

    UE4:Android 平台开发实践指南

    3构建首个 UE 工程 Android 环境配置好了以后,咱们就开始去构建一个 UE 工程,主要的思路是界面 UI 添加一个按钮,点击按钮后触发一个事件,该部分我已经之前的教程整理出来了,大家可以点击查看...image “项目设置” 中找到 “平台” 选项,然后配置 “Android”,将这俩个栏目都设置为同意,接受SDK证书,以及填上名称。...image image Android SDK 填上对应的路径。 image PS:由于我是用的 Mac,所以路径配置和 Windows 的不同。...在下面的文章,会继续教大家如何去调用这个第三方库。 7C++ 调用 Java UE 如何通过 C++ 去调用 Java 的函数呢,这时候就需要使用 JNI 调用来实现。...+ 代码被修改过了,所以需要重新打包卓项目,打包完成以后,我们的 Android Studio 跑起来,点击按钮,控制台中就会打印相应的日志。

    2K30

    Android面试速学】JNI 了解一下?

    android面试老是会问jni,但是我小厂搬砖多年,可还没咋用过啊 哭~~~~ 没用过那就了解一下吧。...说明一下这篇文章的内容和目的: 了解JNI 开发的基础使用 Java 代码和 c++ 的native 方法链接原理 JNI 框架是啥,都有哪些东西 Ndk 是什么东西?...调用该方法的时候,Java_名_类名_方法名的c++函数。 我们先来创建JNI入口java类 JNI.java,定义好java的native方法。...小结: 至此,最小化实现的一个jni样例就完成了,实现了native方法定义以及java对其的调用。 以此为基础,我们未来能深入很多 我们能够慢慢了解跨平台native sdk 如何在卓中使用。...参考Android ART执行类方法的过程,虚拟机执行方法的时候判断是否native方法,执行。 客户端的实现很简单,就是上面提到的静态注册和动态注册方式。 JNI 框架是啥,都有哪些东西?

    11410

    卓手机NFC模拟门禁卡(设置UID)的一种方法

    从文档我们得知Android O平台上的移植需要用到 libnfc-brcm.conf、libnfc-nxp.conf 这两个配置文件,Android P则变为了 libnfc-nci.conf...我们首先通过AN11690.pdf的一幅图来整体认识一下NFCAndroid平台的实现。 ? 卓底层是基于Linux内核的,因此驱动一个硬件设备的Linux设备驱动必不可少。...通过JNI实现Android框架Java代码与NCI的代码相互调用。...JNI_TRUE : JNI_FALSE; } 可以看到,它调用了NfcAdaptation的Initialize()方法和NFA_SetConfig()等libnfc-nci定义的API函数,对硬件和...如果我们写成xposed模块,则可以使用xposed自带的注入,还可以目标进程建立Broadcast Receiver来接收控制APP的指令,模块内直接通过jni即可调用我们native函数。

    16.9K30

    Android监听自身卸载,弹出用户反馈调查

    2,原理分析        上面情景分析后表明Java实现不了这样的一个功能,是否该考虑一下使用JNI了,用C底层为我们实现这样一个打开内置浏览器加载用户反馈网页即可,知道这个方法之前,我们有必要了解以下几个知识点...AM命令         Android系统提供的adb工具,adb的基础执行adb shell就可以直接对android系统执行shell命令         am命令:Android系统通过...--> Android Tools --> Add Native Support,弹出的对话框输入编辑的C/C++的文件名,确定之后,工程的自动生成的jni目录下找到cpp后缀名的文件修改为.c...后缀名的文件,因为本案例是基于C语言实现的,然后同样修改Android.mk文件的LOCAL_SRC_FILES为.cC文件,最后将上面生成好的.h方法签名文件拷贝到jni目录下。...首先,要获取本应用安装的目录/data/data/名,然后获取当前设备的版本号,一起传给本地方法,最后调用这个方法。

    3K50

    NDK开发 从入门到放弃(一:基本流程入门了解)

    JNI与NDK的关系 NDK可以为我们生成了C/C++的动态链接库,JNI是java和C/C++沟通的接口,两者与android没有半毛钱关系,只因为卓是java程序语言开发,然后通过JNI又能与...用C/C++写得库可以方便在其他的嵌入式平台上再次使用。 二、安装与配置 首先我们Android Studio下新建一个卓项目。...javah -jni命令,是根据java文件生成.h头文件的,会自动根据java文件的类名(包含名)与方法名生成对应的C/C++里面的方法名。...public class JniTest { /** * 将用C++代码实现,android代码调用的方法:获取当前app的名 * @param o * @return...然后Activity测试调用,TextView显示我们通过C++代码实现的方法getPackname获取app的名了。

    78230
    领券