是否可以在Android中读取.so文件?

时间:2011-06-07 06:30:45

标签: android

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

6 个答案:

答案 0 :(得分:6)

您必须将.so文件放在lib文件夹中。然后使用演示函数访问它,如下所示:

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;
}

答案 1 :(得分:4)

你无法真正“读取”.so文件;它是一个包含机器代码的编译二进制文件。它真的不可能编辑它。

您可以在其中列出符号,例如:

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

答案 2 :(得分:2)

是的,你可以。您将需要十六进制编辑器来阅读它。因为据我所知,.so与Windows中的.dll类似。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可能可以读取。*。so文件。为此,您需要一台基于Linux的计算机,并且您需要与此相关的leafpad,以便您可以以最易读的视图查看* .so文件,如果在Linux或Notepad ++上使用leafpad,则会发生这种情况。
试试看。
谢谢

答案 5 :(得分:-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

公共类MainActivity扩展了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);
}

}