JNI传递类对象的问题,如何获取long类型

JNI传递类对象的问题,如何获取long类型,第1张

你的JNI接口定义错误,在Java层传入了4个参数,你的JNI接口只有一个参数。

JNIEXPORT jint JNICALL Java_org_jniInterface_CommitTask_myReceiveMsg 

        (JNIEnv env, jclass obj, jinit, jint, jstring, jobject jobj)

前两个参数是默认的,从第三个开始是你需要对应的java接口的参数

C还是C++代码,两者写法不一样哦。

//const char pname = env->GetStringUTFChars(name, NULL); //C++的写法

const char pname = (env)->GetStringUTFChars(env,name, NULL); //C的写法

// JniC2Javacpp : Defines the entry point for the console application

//

#include "stdafxh"

using namespace std;   

  

int main()   

{

 

 JavaVMOption options[1];   // 具有用于 JVM 的各种选项设置

 

 JNIEnv env;   //表示 JNI 执行环境

 

 JavaVM jvm;   //是指向 JVM 的指针,主要使用这个指针来创建、初始化和销毁 JVM

 

 JavaVMInitArgs vm_args; //表示可以用来初始化 JVM 的各种 JVM 参数

 long status; //创建JVM是否成功

 

 jclass cls;   // 指定对象的类定义(jclass) 

 

 jmethodID mid;   // 调用方法的定义(jmethodID) 

 

 jint square;   

 

 jint square2;

 

 jobject jobj;   

 //设置参考jar包,可以修改

 options[0]optionString = "-Djavaclasspath=;/powerAuthorityjar;/sqljdbcjar;/log4j-1214jar;/frameworkjar;/commons-loggingjar;/log4jproperties;/appContextxml;/powerAuthoritylog";   

vm_argsversion = JNI_VERSION_1_2;   

 vm_argsnOptions = 1;   

 

 vm_argsoptions = options; 

status = JNI_CreateJavaVM(&jvm, (void)&env, &vm_args);   //创建jvm ,成功返回0,不成功返回JNI_ERR

 

 if (status != JNI_ERR){ //创建jvm成功

  //获得一个实例对象

  cls = env->FindClass("powersys/util/JNITools");  //获取指定对象的类定义(jclass) 

  

  if(cls !=0) { 

   mid = env->GetMethodID(cls,"<init>","()V"); 

   

   if(mid !=0){ 

    

    jobj=env->NewObject(cls,mid); 

    

    std::cout << "init ok " << mid << std::endl;

   

   } 

//调用登录验证

   mid = env->GetMethodID( cls, "checkLogin", "(Ljava/lang/String;Ljava/lang/String;)I"); //读取要调用方法的定义(jmethodID) 

   

   if(mid !=0){ 

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF(""),env->NewStringUTF("111"));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("admin"),env->NewStringUTF(""));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("admin1"),env->NewStringUTF("admin"));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("abcd"),env->NewStringUTF("1234056"));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("abcd"),env->NewStringUTF("123456"));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("admin"),env->NewStringUTF("admin"));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("test"),env->NewStringUTF("123456"));//调用方法     

    std::cout << square << std::endl;

    std::cout << "checkLogin ok " <<mid<< std::endl;

   }  

//调用检查是否有权 *** 作

   mid = env->GetMethodID( cls, "checkAuthority","(Ljava/lang/String;Ljava/lang/String;)I"); 

   

   if(mid !=0){

square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("test"),env->NewStringUTF("powersysframejdialogAddUserJDialog")); 

    std::cout << square2 << std::endl;  

    square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("test"),env->NewStringUTF("powersysframejdialogEditUserJDialog")); 

    std::cout << square2 << std::endl;  

    square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF(""),env->NewStringUTF("powersysframejdialogAddUserJDialog")); 

    std::cout << square2 << std::endl;  

    square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("admin"),env->NewStringUTF("powersysframejdialogAddUserJDialog")); 

    std::cout << square2 << std::endl;  

    square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("da3"),env->NewStringUTF("powersysframejdialogAddUserJDialog")); 

    std::cout << square2 << std::endl;  

    square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("bush"),env->NewStringUTF("powersysframejdialogAddUserJDialog")); 

    std::cout << square2 << std::endl;  

std::cout << "checkAuthority ok" << std::endl;

   }

  }

  

  jvm->DestroyJavaVM();     

  

  return 0; 

 }

 

 else 

  

  return -1;  

}

jnienv不是java运行环境,但也是一种环境,,,(废话)它被java运行时环境控制着,实际上是Java调用其他语言(通常是C/C++)的环境,该环境主要是Java提供的一系列头文件(h文件),通过引用它们,可以做到其他语言与Java的互交

举个例子,Java定义一个外部函数test(String arg),在c++中实现时,c++通过使用该环境提供的头文件(jnih,通常不需要手动引用)中的定义,来识别Java传来的String类型的参数然后进行处理,否则,Java传来的string类型参数将不被c++识别

另外通过这个环境,还可以在c/c++中使用java中定义好的方法

还有其他的一些功能

纯手打,采纳一下呗!

以上就是关于JNI传递类对象的问题,如何获取long类型全部的内容,包括:JNI传递类对象的问题,如何获取long类型、JNI开发的时候如何使用GetFieldID等方法啊、JNI多线程中findclass怎么用找自定义的类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9498677.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存