0

如果 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} )
4

1 回答 1

0

执行命令不起作用,解决方法是开发一个 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, javaString, nativeString);
    (*env)->DeleteLocalRef(env, javaString);
    }
main(argc, argv);
}

至于日志,它们将在调试器或 Logcat 中可用。

于 2021-05-16T19:18:45.543 回答