问题描述
如果 process = new ProcessBuilder(new String[]{"su","-c","exec " + mylib.so).start() 在没有任何执行迹象的情况下返回 0,如何执行 .so 文件正在发生。
我已经使用 cmake 编译了一个 .c 文件并将其存储为库 (.so)。但是,当尝试执行库(必须运行 main() 函数)时,进程退出值为 0(无错误)时什么也没有发生。
我尝试写入我创建的文件以测试库是否正在执行,但也没有发生任何事情。文件仍然是空的。
int main (int argc,char **argv)
{
LOGW("Running");
FILE* file = fopen("/data/local/tmp/log.txt","w+");
if (file != NULL)
{
fputs("Running\n",file);
fflush(file);
fclose(file);
}}
此外,我找不到cmake日志文件是因为库没有执行吗?如果我在 cmakelist.txt 中添加了日志库,我如何访问日志文件,如下所示:
find_library(
log-lib
log )
target_link_libraries(
mylib
${log-lib} )
解决方法
execute 命令不起作用,但解决方法是开发一个 JAVA 类可以调用的函数,该函数反过来调用主函数。我的 Main 函数需要两个参数,一个是 char 数组 (argv),另一个是要传递的数组长度 (argc)。
JNIEXPORT jint JNICALL
yourapp.class.function_name
(JNIEnv *env,jobject object,jobjectArray stringArray) {
int argc = (*env)->GetArrayLength(env,stringArray);
jsize size = (*env)->GetArrayLength(env,stringArray);
char **argv = (char **) malloc(size);
for (int i = 0; i < size; ++i) {
jstring javaString = (jstring) (*env)->GetObjectArrayElement(env,stringArray,i);
const char *nativeString = (*env)->GetStringUTFChars(env,javaString,0);
argv[i] = strdup(nativeString);
(*env)->ReleaseStringUTFChars(env,nativeString);
(*env)->DeleteLocalRef(env,javaString);
}
main(argc,argv);
}
至于日志,它们将在调试器或 Logcat 中可用。