通过JNI实现C++调用java编写的Alien RFID的程序

// Demo2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "windows.h"  
#include <string>  
#include <iostream> 


using  namespace std; 
string jstring2str(JNIEnv* env, jstring jstr);
string  JStringToCString (JNIEnv *env, jstring str);
char* result=NULL;

///
string js2s(JNIEnv* env, jstring jstr){
    jclass clsstring = (env)->FindClass("java/lang/String" ); 
    jstring strencode = (env)->NewStringUTF( "utf-8"); 
    jmethodID mid = (env)->GetMethodID(clsstring,"getBytes","(Ljava/lang/String;)[B");
    if(mid==0){
        cout<<"getBytes method failure......"<<endl;
        return "";
    }
    const char* strCIn = (env)->GetStringUTFChars(jstr,NULL);
    string s(strCIn);
    (env)->ReleaseStringUTFChars(jstr , strCIn);
    return s;
}

int  main() { 
 
  JavaVMOption options[1];
  JNIEnv *env; 
  JavaVM *jvm; 
  JavaVMInitArgs vm_args; 
  long status; 
  jclass cls; 
  jmethodID mid; 
  jint square; 
  jboolean not ; 
  jobject jobj; 

//////////"-Djava.class.path=.;D:\\;D:/AlienRFID.jar"中“D:\\”指的是要调用的java的类文件所在的路径,“D:/AlienRFID.jar”用于指定第三方jar文件的路径 options[0].optionString = "-Djava.class.path=.;D:\\;D:/AlienRFID.jar"; /////***很重要呀。。。。 vm_args.version = JNI_VERSION_1_4; vm_args.nOptions = 1; vm_args.options = options; status = JNI_CreateJavaVM(&jvm, ( void**)&env, &vm_args); if (status != JNI_ERR) { cout << "create javaVM" << std::endl; ////可以创建虚拟机 cls = env->FindClass( "ReadWrite"); ///这里失败了 if (cls !=0) { cout << "get class" << std::endl; ///开始java的线程 mid = env->GetStaticMethodID(cls, "startListening" , "()V"); if (mid !=0) { cout << "get send method" << std::endl; env->CallStaticIntMethod(cls, mid); } mid = env->GetStaticMethodID(cls, "getTagData" , "()Ljava/lang/String;" ); if (mid !=0) { cout<<"getMessage method"<<endl; string temp("hello"); string last(""); while(true){ jstring message = (jstring)env->CallStaticObjectMethod(cls,mid); if(message != NULL){ //last = jstring2str(env,message); last = js2s(env,message); if(last!=temp){ temp = last; std::cout <<"--------"<<last<<"==="<< std::endl; } //m_threadSleep(2,0); }else{ std::cout <<"--------message=NULL----"<< std::endl; } } }//*/ } jvm->DestroyJavaVM(); cout<<"success destory java VM"<<endl; int i; cin>>i; return 0; } else { cout<<"fail destory java VM"<<endl; int j; cin>>j; return -1; } }

 

posted @ 2013-05-23 11:27  孤独~根号三  阅读(427)  评论(0)    收藏  举报