在Linux桌面上运行Android NDK二进制文件
问题描述:
我从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'
这些应该是在我的桌面环境的,不是吗?
答
并非所有的Linux环境都是相同的(即使跨越分布边界也不能保证正常工作)。 NDK二进制文件是针对Bionic和其他一些特定于Android的库构建的,而您的RedHat系统使用glibc和RedHat存储库中提供的其他一些内容。
tl; dr您无法在桌面Linux上运行Android二进制文件。
那么为什么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安卓设备。 –