【问题标题】:Android NDK - execute .so returning 0 but not workingAndroid NDK - 执行 .so 返回 0 但不工作
【发布时间】:2021-07-28 21:16:29
【问题描述】:

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

【问题讨论】:

  • 这里缺少很多信息。例如,您为什么要尝试使用 exec 而不是像通常那样通过 JNI 调用库?为什么要使用硬编码的文件路径而不是要求 Android 提供允许写入的路径?
  • Android 日志功能的输出,您可以在logcat 输出中找到。通常通过在您已通过 USB 或 WiFi 连接到手机的计算机上运行 adb logcat

标签: android c cmake android-ndk android-native-library


【解决方案1】:

执行命令不起作用,解决方法是开发一个 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 中可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    相关资源
    最近更新 更多