首页
社区
课程
招聘
[讨论]试着复现了下获取文件系统id
发表于: 2021-12-14 14:37 8688

[讨论]试着复现了下获取文件系统id

2021-12-14 14:37
8688

本人纯萌新,最近看到恋空大佬发的帖子之后我就试着整了个单独获取文件系统id,对C还不太熟悉,在文本处理方面犯了难,纯初学,求大佬放过Orz

效果

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <jni.h>


const char* getId();

JNIEXPORT jstring JNICALL Java_com_miyn_device_1id_Main_stringFromJNI(JNIEnv* env, jobject thiz) {
		const char* id_text = getId();
		return (*env)->NewStringUTF(env,id_text);
	}

const char* getId () {
	FILE* res = popen("stat -f /","r");
	if(res==NULL) {
		return "Execute Error!";
	}
	char res_cache[8][1024];
	char res_final[1024];
	int line = 0;
	while( fgets(res_cache[line],1024,res) != NULL) {
		line++;
	}
	pclose(res);
	int scan_res = sscanf(res_cache[1]," ID: %s ",&res_final);
	if(scan_res != 1) {
		return "Get Error!";
	}
	return res_final;
}


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 294
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
这代码块排版咋乱了啊
2021-12-14 14:37
0
雪    币: 2714
活跃值: (1611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <jni.h>
const char* getId();
JNIEXPORT jstring JNICALL Java_com_miyn_device_1id_Main_stringFromJNI(JNIEnv* env, jobject thiz) {
    const char* id_text = getId();
    return (*env)->NewStringUTF(env,id_text);
}
const char* getId () {
    FILE* res = popen("stat -f /","r");
    if(res==NULL) {
        return "Execute Error!";
    }
    char res_cache[8][1024];
    char res_final[1024];
    int line = 0;
    while( fgets(res_cache[line],1024,res) != NULL) {
        line++;
    }
    pclose(res);
    int scan_res = sscanf(res_cache[1]," ID: %s ",&res_final);
    if(scan_res != 1) {
        eturn "Get Error!";
    }
    return res_final;
}

```
2021-12-14 18:30
0
雪    币: 2714
活跃值: (1611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
同型号设备是一致的
2021-12-14 18:30
0
雪    币: 126
活跃值: (179)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
不用JNI也没几行代码,不需要调用命令行的。
    /**
     * 获取文件系统ID
     */
    fun getFileSystemId(path : String = "/"): Long{
        return try{
            val structStatVfs = android.system.Os.statvfs(path)
            structStatVfs.f_fsid
        }catch (e : Throwable){
            0L
        }
    }
2021-12-15 14:04
1
雪    币: 450
活跃值: (3210)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢认可。写得挺好的,但是这种方法相对来说并不是最佳做法,最佳做法是直接调用c语言的statvfs函数API去获取。
2021-12-15 15:58
1
雪    币: 294
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
恋空 谢谢认可。写得挺好的,但是这种方法相对来说并不是最佳做法,最佳做法是直接调用c语言的statvfs函数API去获取。
嗯嗯,多谢指点,另外我发现如果升级系统之后,这个指令获取到的id会变动,虽然也是随机的。。。
2021-12-17 00:14
0
雪    币: 294
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8

谢谢各位大佬指点

最后于 2021-12-17 00:15 被6945编辑 ,原因: 错字
2021-12-17 00:15
0
雪    币: 294
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
hhhaiai 同型号设备是一致的
真的?
2021-12-18 00:10
0
雪    币: 2714
活跃值: (1611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
6945 真的?
真的
2021-12-20 10:21
0
游客
登录 | 注册 方可回帖
返回
//