Android NDK-execute.so返回0但不工作
如果process=newprocessbuilder(新字符串[]{“su”、“-c”、“exec”+mylib.so),如何执行.so文件。start()返回0,但没有任何执行迹象 我已经使用cmake编译了一个.c文件,并将其存储为库(.so)。但是,当尝试执行库(必须运行main()函数)时,当进程退出值为0时(无错误),不会发生任何事情 我试图写入我创建的一个文件,以测试库是否正在执行,但也没有发生任何事情。该文件仍然为空Android NDK-execute.so返回0但不工作,android,c,cmake,android-ndk,android-native-library,Android,C,Cmake,Android Ndk,Android Native Library,如果process=newprocessbuilder(新字符串[]{“su”、“-c”、“exec”+mylib.so),如何执行.so文件。start()返回0,但没有任何执行迹象 我已经使用cmake编译了一个.c文件,并将其存储为库(.so)。但是,当尝试执行库(必须运行main()函数)时,当进程退出值为0时(无错误),不会发生任何事情 我试图写入我创建的一个文件,以测试库是否正在执行,但也没有发生任何事情。该文件仍然为空 int main (int argc, char **argv
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函数。我的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);
}
JNIEXPORT jint JNICALL
yourapp.class.function\u名称
(JNIEnv*env,jobject对象,jobjectArray stringArray){
int argc=(*env)->GetArrayLength(env,stringArray);
jsize size=(*env)->GetArrayLength(env,stringArray);
字符**argv=(字符**)malloc(大小);
对于(int i=0;iGetObjectArrayElement(env,stringArray,i);
const char*nativeString=(*env)->GetStringUTFChars(env,javaString,0);
argv[i]=strdup(本地投资);
(*env)->ReleaseStringUTFChars(env、javaString、nativeString);
(*env)->DeleteLocalRef(env,javaString);
}
主(argc、argv);
}
至于日志,它们可以在调试器或Logcat中找到。这里缺少很多信息。例如,为什么您要尝试使用
exec
,而不是像通常那样通过JNI调用库?为什么您要使用硬编码的文件路径,而不是向Android请求允许的路径o写入?关于Android日志功能的输出,您可以在logcat
输出中找到它。通常通过在您通过USB或WiFi连接到手机的计算机上运行adb logcat
。