我從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'
這些應該是在我的桌面環境的,不是嗎?
那麼爲什麼APK中提供了一個x86庫?是不是Windows BlueStacks模擬器的工作原理?並且獲取UnsastifiedLinkerError是不兼容的症狀? – Nederealm
我在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
因爲有x86安卓設備。 –