你的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怎么用找自定义的类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)