2017-03-07 71 views
0

我從Play商店下載了包含本機代碼二進制文件的APK。在APK文件中有一個lib/x86文件夾,該文件夾可能包含一個包含本機過程的庫文件,通常是.so擴展名。由於代碼在x86中,是否可以編寫Java程序來調用桌面上的庫?即使你沒有該庫的源代碼。 NDK函數只需接受參數並返回一個值。例如,我們可以寫在Linux桌面上運行Android NDK二進制文件

class AppNativeLoader 
{ 
    public static native void generateRand(int seed); 

    static 
    { 
     System.loadLibrary("AndroidNDKLib"); 
    } 
} 

public class WCallTest 
{ 
    public static void main(String[ ] args) 
    { 
     long seed = System.currentTimeMillis(); 

     if(args.length > 0) { 
      seed = Long.valueOf(args[0]); 
     } 

     long rand = AppNativeLoader.generateRand(seed); 

     System.out.println(rand); 
    } 
} 

注意:這只是一個示例。實際環境不同。在RHEL上使用JRE 7時,我提取了x86 .so並將其放在與.class文件相同的目錄中。我仍然收到UnSatisfiedLinkerError。有什麼不妥?假設沒有回調,並且該功能沒有使用Android API,這可能嗎?

編輯:我臨開的lib在IDA,我看到了以下相關

.plt:0000B100 ; Needed Library 'liblog.so' 
.plt:0000B100 ; Needed Library 'libz.so' 
.plt:0000B100 ; Needed Library 'libc.so' 
.plt:0000B100 ; Needed Library 'libm.so' 
.plt:0000B100 ; Needed Library 'libstdc++.so' 
.plt:0000B100 ; Needed Library 'libdl.so' 

這些應該是在我的桌面環境的,不是嗎?

回答

1

並非所有的Linux環境都是相同的(即使跨越分佈邊界也不能保證正常工作)。 NDK二進制文件是針對Bionic和其他一些特定於Android的庫構建的,而您的RedHat系統使用glibc和RedHat存儲庫中提供的其他一些內容。

tl; dr您無法在桌面Linux上運行Android二進制文件。

+0

那麼爲什麼APK中提供了一個x86庫?是不是Windows BlueStacks模擬器的工作原理?並且獲取UnsastifiedLinkerError是不兼容的症狀? – Nederealm

+0

我在IDA PRO中打開了庫,我看到以下依賴關係.plt:0000B100;需要庫'liblog.so' .plt:0000B100;需要庫'libz.so' .plt:0000B100;需要的庫'libc.so' .plt:0000B100;需要的庫'libm.so' .plt:0000B100;需要庫'libstdC++。so' .plt:0000B100;需要的庫'libdl.so' – Nederealm

+0

因爲有x86安卓設備。 –

0

你可以嘗試從here下載所需的共享庫(請確保選擇正確的API版本和架構相匹配的NDK共享庫的結構,找出哪些共享庫,你需要,你可以簡單地使用ldd) 。

然後,要輕鬆訪問共享庫公開的方法,可以使用jadx反編譯應用程序的java代碼,然後在JNI類中編寫自己的代碼。

然後,要編譯你的java代碼,你可以使用任何版本的JDK

然後,要執行它,你必須使用與NDK共享庫的體系結構相匹配的版本JRE(在你的情況下,你必須下載32位JRE)。

但是,這並不能保證正常工作:我正在使用NDK共享庫中的段錯誤,因爲大多數NDK二進制文件被剝離,調試將成爲一場噩夢。

相關問題