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

Kis*_*nga 2 java-native-interface android android-ndk

对于共享库的保护问题,我将尝试使用JNI获取包名,但它会产生错误.那么,是否可以使用JNI获取包名称或applicationId?如果有人有这个问题的例子或参考,那么建议.因为没有任何好的教程或解决方案可用.否则,任何其他方式都建议保护共享库.

ali*_*dro 14

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

在您的示例中,此处存储的信息 /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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以更轻松地使用“/proc/self/cmdline”,从而跳过对“getpid()”的调用。 (4认同)