【发布时间】:2014-01-15 11:49:33
【问题描述】:
我创建了一个成功执行以下操作的 NDK 应用程序:
#include <string.h>
#include <stdio.h>
#include <android/log.h>
JNIEXPORT jstring JNICALL Java_my_package_NativeAccess_stringFromJNI(
JNIEnv* env, jobject thiz) {
char* str = "Native Code!";
FILE* file = fopen("sdcard/hello.txt","w+");
if (file == NULL) {
file = fopen("mnt/sdcard/hello.txt","w+");
if (file == NULL) {
file = fopen("storage/sdcard/hello.txt","w+");
}
}
if (file == NULL) {
str = "Native Code! fopen() did not work!";
__android_log_write(ANDROID_LOG_ERROR, "AAAAAAAA", "file null!");
}
else{
str = "Native Code! fopen() worked!";
__android_log_write(ANDROID_LOG_ERROR, "AAAAAAAA", "file exists!");
fputs("HELLO WORLD!\n", file);
fflush(file);
fclose(file);
}
return (*env)->NewStringUTF(env, str);
}
我在自定义构建的源中启动应用程序。它是最新的 KitKat 版本。那里我只是改变了
/bionic/libc/upstream-freebsd/lib/libc/stdio/fopen.c
通过以下方式:
FILE *
fopen(const char *file, const char *mode)
{
//====================
fputs ("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n", stdout);
int uid = getuid();
int pid = getpid();
int ppid = getppid();
fprintf(stdout, "uid = %d", uid);
fputs ("\n", stdout);
fprintf(stdout, "pid = %d", pid);
fputs ("\n", stdout);
fprintf(stdout, "ppid = %d", ppid);
fputs ("\n", stdout);
fputs ("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n", stdout);
//====================
// ... the usual fopen continues here
}
使用自定义构建的 Android 源启动模拟器时,我只能通过 LogCat 获得以下输出:
01-15 06:18:18.400: I/stdout(1417): XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
01-15 06:18:18.400: I/stdout(1417): uid = 1001
01-15 06:18:18.400: I/stdout(1417): pid = 1417
01-15 06:18:18.400: I/stdout(1417): ppid = 1217
01-15 06:18:18.400: I/stdout(1417): XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
什么时候做
adb shell ps
我明白了
USER PID PPID VSIZE RSS WCHAN PC NAME
...
root 1217 1 205812 40176 ffffffff b6f395ec S zygote
...
radio 1417 1217 238984 25788 ffffffff b6f3a650 S com.android.phone
...
u0_a1 1697 1217 217744 20236 ffffffff b6f3a650 S com.android.providers.calendar
因此,uid 1001 (== USER u0_a1 ) 不是我的应用程序。
我的应用有 uid 10055:
$ adb shell dumpsys package my.package | grep userId=
userId=10055 gids=[3003, 1028, 1015]
我的问题是:为什么我的 fopen 本地调用没有被记录,但系统内部调用却被记录了?
谢谢!
【问题讨论】:
标签: android-ndk android-source libc