Android NDK - 执行 .so 返回 0 但不工作
Android NDK - execute .so returning 0 but not working
如果 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} )
执行命令不起作用,解决方法是开发一个 JAVA class 可以调用的函数,在 return 中调用主函数。我的 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 中可用。
如果 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} )
执行命令不起作用,解决方法是开发一个 JAVA class 可以调用的函数,在 return 中调用主函数。我的 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 中可用。