如何使用JNI android获得应用程序包名称或applicationId

 2023-01-20    283  

问题描述

对于共享库的保护问题,我将尝试使用JNI获取软件包名称,但会出现错误.那么,是否可以使用JNI获取软件包名称或ApplicationID?如果有人有此问题的示例或引用,那么建议.因为没有任何好的教程或解决方案.否则任何其他方法都建议保护共享库.

推荐答案

是的,这是可能的. Android基于Linux,我们可以在内核提供的用户空间中获得很多信息.

如何使用JNI android获得应用程序包名称或applicationId

在您的示例中,存储在此处的信息/proc/${process_id}/cmdline

我们可以读取此文件,并获取应用程序ID.

请参阅一个简单的示例

#include <jni.h>
#include <unistd.h>
#include <android/log.h>
#include <stdio.h>

#define TAG "YOURAPPTAG"

extern "C"
JNIEXPORT void JNICALL
Java_com_x_y_MyNative_showApplicationId(JNIEnv *env, jclass type) {

    pid_t pid = getpid();
    __android_log_print(ANDROID_LOG_DEBUG, TAG, "process id %d\n", pid);
    char path[64] = { 0 };
    sprintf(path, "/proc/%d/cmdline", pid);
    FILE *cmdline = fopen(path, "r");
    if (cmdline) {
        char application_id[64] = { 0 };
        fread(application_id, sizeof(application_id), 1, cmdline);
        __android_log_print(ANDROID_LOG_DEBUG, TAG, "application id %s\n", application_id);
        fclose(cmdline);
    }
}

其他推荐答案

这对我有用:

static jstring get_package_name(
      JNIEnv *env,
      jobject jActivity
  ) {
    jclass jActivity_class= env->GetObjectClass(jActivity);

    jmethodID jMethod_id_pn = env->GetMethodID(
        jActivity_class,
        "getPackageName",
        "()Ljava/lang/String;");
    jstring package_name = (jstring) env->CallObjectMethod(
        jActivity,
        jMethod_id_pn);

    return package_name;
  }

以上所述是小编给大家介绍的如何使用JNI android获得应用程序包名称或applicationId,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26151.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。