1. 程式人生 > >android ndk 開發獲取應用包名以及keystroe簽名信息

android ndk 開發獲取應用包名以及keystroe簽名信息

在做此操作之前,需要保證ndk環境以配置完成,並對jni的語法有一定的瞭解。

1.定義native java 類


這裡的InfoJni  是在app  build 檔案中配置的moduleName 保持一致


2.通過jni 編譯成.h 檔案

首先Terminal 進入到 java 資料夾下 ,然後執行命令—>: javah -encoding utf-8 -jni com.mvp.cn.jni.JNIUtil


3.將剛剛編譯玩的標頭檔案放入新建的jni資料夾下


4,在jni資料夾下建立.c 檔案,引入剛才放進來的.h標頭檔案,開始寫獲取自己的程式碼邏輯

獲取包名程式碼如下:

    jclass contextClass = (jclass)(*env)->NewGlobalRef(env,(*env)->FindClass(env,"android/content/Context"));
    jmethodID getPackageNameId = (*env)->GetMethodID(env,contextClass, "getPackageName","()Ljava/lang/String;");
    jstring packNameString =  (jstring)(*env)->CallObjectMethod(env,contextObject, getPackageNameId);
    return packNameString;

獲取應用簽名信息程式碼如下:

jclass context_class = (*env)->GetObjectClass(env,context_object);
    //context.getPackageManager()
    jmethodID methodId = (*env)->GetMethodID(env,context_class, "getPackageManager", "()Landroid/content/pm/PackageManager;");
    jobject package_manager_object = (*env)->CallObjectMethod(env,context_object, methodId);
    if (package_manager_object == NULL) {
//        __android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageManager() Failed!");
        return NULL;
    }


    //context.getPackageName()
    methodId = (*env)->GetMethodID(env,context_class, "getPackageName", "()Ljava/lang/String;");
    jstring package_name_string = (jstring)(*env)->CallObjectMethod(env,context_object, methodId);
    if (package_name_string == NULL) {
//        __android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageName() Failed!");
        return NULL;
    }


    (*env)->DeleteLocalRef(env,context_class);


    //PackageManager.getPackageInfo(Sting, int)
    jclass pack_manager_class = (*env)->GetObjectClass(env,package_manager_object);
    methodId = (*env)->GetMethodID(env,pack_manager_class, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
    (*env)->DeleteLocalRef(env,pack_manager_class);
    jobject package_info_object = (*env)->CallObjectMethod(env,package_manager_object, methodId, package_name_string, 64);
    if (package_info_object == NULL) {
//        __android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageInfo() Failed!");
        return NULL;
    }


    (*env)->DeleteLocalRef(env,package_manager_object);


    //PackageInfo.signatures[0]
    jclass package_info_class = (*env)->GetObjectClass(env,package_info_object);
    jfieldID fieldId = (*env)->GetFieldID(env,package_info_class, "signatures", "[Landroid/content/pm/Signature;");
    (*env)->DeleteLocalRef(env,package_info_class);
    jobjectArray signature_object_array = (jobjectArray)(*env)->GetObjectField(env,package_info_object, fieldId);
    if (signature_object_array == NULL) {
//        __android_log_print(ANDROID_LOG_INFO, "JNITag","PackageInfo.signatures[] is null");
        return NULL;
    }
    jobject signature_object = (*env)->GetObjectArrayElement(env,signature_object_array, 0);


    (*env)->DeleteLocalRef(env,package_info_object);


    //Signature.toCharsString()
    jclass signature_class = (*env)->GetObjectClass(env,signature_object);
    methodId = (*env)->GetMethodID(env,signature_class, "toCharsString", "()Ljava/lang/String;");
    (*env)->DeleteLocalRef(env,signature_class);
    jstring signature_string = (jstring)(*env)->CallObjectMethod(env,signature_object, methodId);
    return signature_string;

5,到這裡就寫完了,然後開始編譯

編譯完成後:

然後將這幾個so庫放入 工程 libs下

然後在activity 中就可以呼叫剛才定義的native方法了。如圖。


到這裡就大功告成了-。-

相關推薦

android ndk 開發獲取應用以及keystroe簽名

在做此操作之前,需要保證ndk環境以配置完成,並對jni的語法有一定的瞭解。 1.定義native java 類 這裡的InfoJni  是在app  build 檔案中配置的moduleName 保持一致 2.通過jni 編譯成.h 檔案 首先Terminal 進入到

Android自動化測試探索(三)Android SDK tools安裝、aapt配置以及使用aapt獲取apk

Android SDK tools安裝 下載連線: https://www.androiddevtools.cn 找到對應mac的版本下載安裝即可   AAPT配置 #1. 進入根目錄 cd ~  #2. 開啟.bash_profile,  如

java解析xml文件練習——通過應用獲取應用圖標即其他(基於魅族應用商店)

fin vma tdm row con smartd enter music close 1、解析包名數據文件(txt文件),並生成包名數組: package jsouphtml; import java.io.BufferedReader; import j

Android----獲得當前應用、當前activity的名字、推斷是否是系統桌面、service類

owin agen gac arr ddc add gets small cli 1、獲得當前應用包名 public static String getRunningActivityName(Context context) { ActivityManager acti

查看Android應用、Activity的幾個方法

local get edit pack too edi androidm shell mcu 一、沒有apk,應用已經安裝到手機或虛擬機中 1.logcat .清除logcat內容,使用命令adb logcat -c .啟動logcat,使用命令adb logcat Act

使用adb檢視android程式的以及棧頂的activity

windows下進入cmd,定位路徑到adb.exe的路徑,然後使用命令:     adb shell dumpsys activity | findstr "mFocusedActivity" 就能看到當前棧頂的activity名字了 如果adb shell命令出

adb獲取以及當前執行的activity

1.由包名獲取apk路徑 adb shell pm path io.ionic.starter 2.開啟需要獲取的APP,執行一下命令即可 adb shell dumpsys window | f

Android Studio下Ndk開發踩過的坑以及解辦法決

 Android studio在2.2之後是開始相容ndk的開發,嚐鮮用來本地開發,各種坑,不相容。之前用得好好的,一個升級AS或者NDK版本都會一不小心導致了編譯失敗,或者成功之後,載入不成功。故隨手筆記記錄下自己踩過的坑,也方便其他人查詢。 Trap One :

Android開發之修改

        開發過程中有時候會由於各種原因需要修改包名,網上有很多帖子,很多方法,不過他們都有一個共同的特點就是支援如下包名的修改:com.abc.def.cde修改成com.ccc.ddd.fff等等,他們修改的特點如下:        1.包名的長度不變。例如都是四級

PB獲取應用程式路徑以及exe

一.宣告全域性或者區域性函式 Function uint GetModuleFileName(ulong hModule,ref string lpFilename,ulong nSize) Library "kernel32.dll" alias for "GetModu

Android專案基本成型後,更換應用(package)的方法

起因 這裡本人也是第一次更改,由於之前一個APK專案裡面分了好幾個專案,導致有些功能不能同時使用,所以需要將一個APK同時安裝兩個(不同的專案)在手機上,因為應用開發者的問題也就是包名不能重複,不能同

Android檢視應用package和launcher_activity名稱的方法

** 方法一:使用sdk自帶工具aapt ** //aapt是sdk自帶的一個工具,在sdk\builds-tools\目錄下 1.以ES檔案瀏覽器為例,命令列中切換到aapt.exe目錄執行:aapt dump badging E:\apk\es3

Android NDK開發 native層獲取Surface並顯示影象 思路過程

import java.io.File;import java.io.FileInputStream;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Canvas;import android

Android----獲得當前應用、當前activity的名字、判斷是否是系統桌面、service類

public class FloatWindowService extends Service {/*** 用於線上程中建立或移除懸浮窗。*/private Handler handler = new Handler();/*** 定時器,定時進行檢測當前應該建立還是移除懸浮窗。*/private Timer

獲取僅有apk的應用與類

在做android SDK開發的時候,為了配合運營需要獲取遊戲的apk包名。所以在網上查找了資料,可以通過命令列adb的方式獲取apk的包名和類名。具體操作如下 1.手機先運行遊戲或者應用 2.然後開啟

Android啟動一個只知道應用

我們知道,要啟動一個應用,就需要知道應用啟動Activity的名稱,可是啟動Activity的ACTION引數,這樣就可以通過startActivity(Intent)來啟動,如: /**被啟動的應用的包名為com.xx.xx,應用的入口為com.xx.xx.TestLa

android studio 修改應用ID,應用

1、修改應用ID每一個App都必須有唯一的應用ID,如果兩個App的應用ID相同,同時安裝在一臺手機上的時候會報錯。修改一個App的應用ID,則視修改後的App為一個新的App。修改方法:  開啟 App module  -> build.gradleapply plu

Android NDK 開發總結

設置 .text nbsp def runt 編寫 abi 文件的 targe 一.安裝配置環境 1.安裝Android Studio,下載路徑https://developer.android.com/studio/index.html?hl=zh-cn。我下載的是Win

android NDK開發中,用Cygwin調試本地代碼時報錯“Another debug session running,Use --force to kill it”原因及解決的方法

能夠 att cati kill 時報 andro 使用 deb gdb調試 在使用ndk-gdb調試的時候。運行$NDK/ndk-gdb --verbose報錯“Another debug session running,Use --force to kil

Android Studio開發獲取本地時間

import 自己 public ack info 聊天記錄 datetime AS IV 實現本地聊天記錄功能,用到獲取本地時間的函數,感覺比較實用,分享給大家! 1、在相應moudle的java文件夾下建立自己的util文件夾如·: 2、建立DateUtil類 pa