在android中通过jni在c中调用Main

Calling the Main in c by jni in android

本文关键字:Main 调用 android jni      更新时间:2023-10-16

我想调用main:

int main(int argc, char *argv[])

我试过这个链接:如何使用JNI调用"main"函数需要一个字符指针数组?

JNIEXPORT jint JNICALL Java_package_Class_lameMain(JNIEnv *env, jclass class,  jobjectArray jargv)
{    //jargv is a Java array of Java strings
     int argc = env->GetArrayLength(jargv);
     typedef char *pchar;
     pchar *argv = new pchar[argc];
     int i;
     for(i=0; i<argc; i++)
     {
         jstring js = env->GetObjectArrayElement(jargv, i); //A Java string
         const char *pjc = env->GetStringUTFChars(js); //A pointer to a Java-managed char buffer
         size_t jslen = strlen(pjc);
         argv[i] = new char[jslen+1]; //Extra char for the terminating null
         strcpy(argv[i], pjc); //Copy to *our* buffer. We could omit that, but IMHO this is cleaner. Also, const correctness.
         env->ReleaseStringUTFChars(js, pjc);
     }
     //Call main
     main(argc, argv);
    //Now free the array
    for(i=0;i<argc;i++)
       delete [] argv[i];
   delete [] argv;   
 }   

但是它不起作用,因为我是用C而不是c++编程的。在我做了一些改变之后,有一个问题在"GetArrayLength"这个错误:

error: request for member 'GetArrayLength' in something not a structure or union

我也试过这个链接:如何在Android中通过JNI调用C文件中的main函数?

 JNIEXPORT return_type JNICALL Java_full_package_name_classname_functionname(JNIEnv *env, jobject object, Jobject stringArray){
// your argc
int size = env->GetArrayLength(stringArray);
char **argv = new char*[size];
for (int i=0; i < size; ++i) 
{
    jstring string = env->GetObjectArrayElement(stringArrays, i);
    const char* cString = env->GetStringUTFChars(string, 0);
    argv[i] = strdup(cString);
    env->ReleaseStringUTFChars(string, myarray);
    env->DeleteLocalRef(string);
}
// you will need to modify main so it does properly cleanup
main(argc, argv);
// clean up
for(int i = 0; i < size; ++i)
    free(argv[i]);
delete [] argv;
}

错误是:Java_package_Class_lameMain之前预期的';'或','

对你的函数这样做:

JNIEXPORT void JNICALL Java_ClassName_MethodName
  (JNIEnv *env, jobject obj, jstring javaString)
{
    const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0);
    (*env)->ReleaseStringUTFChars(env, javaString, nativeString);
}

问题是使用*env

参见此处的C-examplehttp://en.wikipedia.org/wiki/Java_Native_Interface