不好意思請教如何由C code"自動"callback回java method

 

各位好:
    小弟目前必須使用JNI的invocation API去cearteVM再找到特定的object並呼叫其方法,
, 呼叫物件方法如果由java call C的時候是很容易實作的因為與JVM的通道是由java打開 , 但是如果今天倒過來要由C呼叫java中的物件(與JVM的通道是由C打開)這樣的話就不是很清楚該怎麼做 , 因為C的部分是在linux下執行所以有想過應該是要create一個thread讓他可以使用invocation API指回JVM 再去找java物件 , 因為小弟我不熟linux的東西 , 不曉得各位是否可以推薦相關的網站或是資料可以給小弟參考 , 或是知道這種issue應該要由怎樣的方向下手會比較好 , 請給小弟一些建議

thanks a lot

 

4則回應

  • 2009-09-30 20:38
  • 果然站上隱藏著強者啊!!!!!!

    2009-08-12 02:39
  • #include <stdio.h>
    #include <jni.h>
    #include <string.h>

    JNIEnv* create_vm(JavaVM ** jvm)

    {

        JNIEnv *env;
        JavaVMInitArgs vm_args;
        JavaVMOption options[2];

        options[0].optionString = "-Djava.compiler=NONE"; 
        options[1].optionString = "-Djava.class.path=."; /* user classes */

        vm_args.version = JNI_VERSION_1_4; //JDK version.
        vm_args.options = options;
        vm_args.nOptions = 2;
        vm_args.ignoreUnrecognized = 0;

        int ret = JNI_CreateJavaVM(jvm, &env, &vm_args);
        if(ret < 0)
            printf("\nUnable to Launch JVM %d\n",ret);
        return env;
    }

    int main(int argc, char* argv[])
    {
        JNIEnv *env;
        JavaVM * jvm;
        env = create_vm(&jvm);

        if (env == NULL)
            return 1;

        jclass clsH =NULL;

        jmethodID midMain = NULL;
        jmethodID midCalling = NULL;

       clsH = env->FindClass("Hello");

      if (clsH != NULL)
        {
            midMain       = env->GetStaticMethodID(clsH, "main", "([Ljava/lang/String;)V");
            midCalling    = env->GetStaticMethodID(clsH,"TestCallMethod","(Ljava/lang/String;)V");
        }
        else
        {
            printf("\nUnable to find the requested class\n");
        }

        /************************************************************************/
        /* Now we will call the functions using the their method IDs            */
        /************************************************************************/
        if(midMain != NULL)
            env->CallStaticVoidMethod(clsH, midMain, NULL); //Calling the main method.

        if (midCalling!=NULL)
        {
            jstring StringArg = env->NewStringUTF("\nTestCall:Called from the C Program\n");
            //Calling another static method and passing string type parameter
            env->CallStaticVoidMethod(clsH,midCalling,StringArg);
        }

        //Release resources.
        int n = jvm->DestroyJavaVM();
        return 0;
    }
     

     

    2009-08-11 00:18
波尔与莱特兄弟 享受飞行带来的相对冷静 波尔与莱特兄弟 享受飞行带来的相对冷静 2 年前
黑客開發者知道哪裡有免費中文上傳app軟體的平台嗎? 黑客開發者知道哪裡有免費中文上傳app軟體的平台嗎? 3 年前
[程式問題]使用sqlite做簡訊攔截 [程式問題]使用sqlite做簡訊攔截 3 年前
Cheap Adidas Shoes he is described.I thought Cheap Adidas Shoes he is described.I thought 3 年前
Treatments For Skin Tint From Costume Jewellery Treatments For Skin Tint From Costume Jewellery 4 年前
[ZDbox]正點工具箱團隊在全球範圍內尋求商務合作 [ZDbox]正點工具箱團隊在全球範圍內尋求商務合作 4 年前

熱門文章

最新消息