我是Android新手,我有一个包含.so
文件的项目。在一个.java
文件中,使用了此lib,我想读取.so
文件。
答案 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);
}
}