在安卓系统中,是否有可能读取.so文件?

7

我是Android新手,有一个项目包含一个.so文件。在一个.java文件中,使用了这个库,我想读取那个.so文件。

6个回答

6
您需要将 .so 文件放置在 lib 文件夹中。然后按照下面所示使用 demo 函数进行访问:
public static boolean loadNativeLibrary() {

    try {

        Log.i(TAG, "Attempting to load library: " + LIBRARY_NAME);
        System.loadLibrary(LIBRARY_NAME);

    } catch (Exception e) { 
        Log.i(TAG, "Exception loading native library: " + e.toString());
        return false;
    }

    return true;
}

2
@JK 谢谢回复,但我的意思是如何转换 .so 文件,以便我能够读取该文件。我不想知道如何使用它。 - Himanshu Dudhat

4

您无法真正“阅读”一个.so文件;它是一个包含机器代码的已编译二进制文件。因此它不容易被编辑。

但是,您可以列出其中的符号,例如:

android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-nm ./path/to/libfoo.so

在CMD中我得到了“fileName.so”不是普通文件的错误?你有其他解决方案吗? - Deepak
@Deepak 那是什么类型的文件呢?你可以尝试在它上面运行 "ls -l" 或者 "file" 命令吗? - JosephH
它是一个Android的.so文件。这个文件是在编译C源代码后生成的。它想要以某种可读格式读取.so文件的内容。 - Deepak

2

是的,你可以。你需要使用十六进制编辑器来读取它。因为,据我所知,.so就像Windows中的.dll一样。


如果您想使用它,可以利用@Jaydeep的答案。如果您想查看其内容,请使用十六进制编辑器打开它。 - ariefbayu

0

你可能可以阅读*.so文件。为此,您需要一台Linux基础计算机,并且您需要leafpad。使用它,您可以查看*.so文件的最可读视图。如果您在Linux上使用leafpad或Notepad ++,这将发生。
试试看吧。
谢谢


0

实际上,在您的JNI文件夹中,Android NDK将您的本地代码(如C或C++)转换为二进制编译代码,称为“filename.so”。您无法读取二进制代码 .so它将在libs/armeabi/文件夹内创建lib文件夹和filename.so文件。


-1

是的,您可以使用ReadElf.java读取它。 https://android.googlesource.com/platform/cts/+/17fcb6c/libs/deviceutil/src/android/cts/util/ReadElf.java

以下代码正在读取.SO文件并查找架构类型。

完整代码- https://github.com/robust12/ArchFinderBLStack.git

public class MainActivity extends AppCompatActivity {

private final String TAG = "MainActivity";

private final String ARMV7ABI = "armeabi-v7a";
private final String X86 = "x86";
private final String MIPS = "mips";
private final String X86_64 = "x86_64";
private final String ARM64_V8 = "arm64-v8a";
private final String ARMABI = "armeabi";
private String result = "";

private File[] libFilesArray;
private int request_code = 1;
HashMap<Integer, String> typeMap;
private TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = findViewById(R.id.textViewId);
    typeMap = new HashMap<>();
    initializeMap();
    readFilesFromStorage();
    textView.setText(result);
    textView.setMovementMethod(new ScrollingMovementMethod());
}
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
private void readFilesFromStorage() throws NullPointerException {
    String filePath = Environment.getExternalStorageDirectory() + "/test-input/";
    File readSOFILE = new File(filePath);
    if(!readSOFILE.exists()) {
        result = getString(R.string.path_not_exist);
        return;
    }
    libFilesArray = readSOFILE.listFiles();
    if(libFilesArray == null) {
        result = getString(R.string.error);
        return;
    }
    findAbiType();
}

private void findAbiType() {
    int count = libFilesArray.length;
    int soCount = 0;
    result = "";
    Log.e(TAG, "Count  is  " + count);
    for (int i = 0; i < count; i++) {
        try {
            if (libFilesArray[i].isFile()) {
                int type = ReadElf.read(libFilesArray[i]).getType();
                if (type == 3) {
                    soCount++;
                    int archCode = ReadElf.e_machine;
                    result += libFilesArray[i].getName() + " - " + typeMap.get(archCode) + "\n\n";
                    Log.e(TAG, "Code  is  " + archCode);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    if(soCount != 0) {
        result += "Total Libs Count: " + soCount + "\n\n";
    } else{
        result = getString(R.string.incorrect_type_libs);
    }
}

private void initializeMap() {
    typeMap.put(40, ARMV7ABI);
    typeMap.put(3, X86);
    typeMap.put(8, MIPS);
    typeMap.put(62, X86_64);
    typeMap.put(183, ARM64_V8);
    typeMap.put(164, ARMABI);
}

}


请在答案中添加相关代码,以便在文件或链接无法使用时保留代码。 - Himanshu Bansal
1
我已经编辑了答案,并附上了代码和示例Android应用程序的GitHub链接。 - Jitendra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接