我是Android新手,有一个项目包含一个.so
文件。在一个.java
文件中,使用了这个库,我想读取那个.so
文件。
我是Android新手,有一个项目包含一个.so
文件。在一个.java
文件中,使用了这个库,我想读取那个.so
文件。
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;
}
您无法真正“阅读”一个.so文件;它是一个包含机器代码的已编译二进制文件。因此它不容易被编辑。
但是,您可以列出其中的符号,例如:
android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-nm ./path/to/libfoo.so
是的,你可以。你需要使用十六进制编辑器来读取它。因为,据我所知,.so
就像Windows中的.dll
一样。
你可能可以阅读*.so文件。为此,您需要一台Linux基础计算机,并且您需要leafpad。使用它,您可以查看*.so文件的最可读视图。如果您在Linux上使用leafpad或Notepad ++,这将发生。
试试看吧。
谢谢
实际上,在您的JNI文件夹中,Android NDK将您的本地代码(如C或C++)转换为二进制编译代码,称为“filename.so”。您无法读取二进制代码 .so它将在libs/armeabi/文件夹内创建lib文件夹和filename.so文件。
是的,您可以使用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);
}
}