如何判断callvoidmethod的参数methodid为空

如何判断callvoidmethod的参数methodid为空,第1张

1。对于本地静态方法 public static native String getStr(); 对应C/C++代码,不需要加入static关键字。

2。对于静态方法。第二个参数:jclass 表示调用类。

3。对于非静态方法。第二个参数 :jobject 表示类实例。

4。对于多个参数。好吧比如两个ini,那么就是:"(II)V"); 一个:"(I)V");

一下是例子

c/c++ 代码

JNIEXPORT jstring JNICALL Java_com_permadi_testjni_JNIDemo_getStr(JNIEnv env,

jclass obj) {

jmethodID onMapSurfaceCreate = env->GetMethodID(obj, "fsum", "(II)V");

jobject mFileDescriptor = env->NewObject(obj, onMapSurfaceCreate);

env->CallVoidMethod(mFileDescriptor, onMapSurfaceCreate, 1, 2);

return env->NewStringUTF("I'm from C!");

}

java 代码:

import androidutilLog;

public class JNIDemo {

// 本地静态方法

public static native String getStr();

// 本地方法

public native int getCint(String str);

// 回调函数

private void fsum( int i, int j){

Loge("aaaa", "aaaaa");

}

static {

SystemloadLibrary("TestJni");

}

}

eg:

jsp页面:

<form method="post" name="form1" action="/unionAccountDrawdoop=addUserInfo" accept-charset="UTF-8">

<div class="c_msg2 red2 t14 tb wryh">

<div class="dl l17 m10">真实姓名</div>

<div class="dl"><input type="text" name="MBRName" id="MBRName" class="c_input"/></div>

<div class="dl l17 m10">身份z号</div>

<div class="dl"><input type="text" name="MBIdCard" id="MBIdCard" class="c_input"/></div>

</div>

<div class="b_button tc"><img src="/liantong_dazzle/images/tx1png" width="126" height="34" align="absmiddle" style="cursor:pointer" onclick="documentform1submit()"/></div>

</form>

根据form表单中的action属性中的值,点击提交的时候去找相对应路径的类和方法。op是类中的方法。

后台Action:

addUserInfo方法中,就可以用

String name = requestgetParameter("MBRName");

String idcard = requestgetParameter("MBIdCard");

去接收前台输入的值。然后调用保存数据库的方法,就能把前台jsp页面的值保存到数据库中。

如果还有什么问题,欢迎追问哦。

jstring encoding = (env)->NewStringUTF("GB2312");

这句只是得到一个内容为“GB2312”的jstring字符串而已,因为这个字符串后面NewObject创建jstring时,jstring的构造函数需要用到(想想你在JAVA里将byte数组转换为一个GB2312编码的String会怎么做,你会需要在构造函数那明确写一个“GB2312“这样的参数)。

总而言之,你这里给出的所有代码的目的就是:将一个C语言中的char字符串转换为编码为GB2312的JAVA字符串(在JNI中用jstring代表)并返回。

Java中字符串的比较须要用equals函数:

String a = rib("ceshi");

if( aequals("ceshi") )

{

   //  相同

}

else

{

   //  不相同

}

利用

jni

的回调机制

java层定义

native方法

private

void

aa(string

c)

{

output(c);

};

JNI层添加native数组

static

JNINativeMethod

array

=

{

{

“aa",

"(JString)V",

(void)JNI_aa,

},

};

jni层调用注册的方法

jclass

cls

=

(env)->GetObjectClass(env,

log);

jmethodID

jmid

=

(env)->GetMethodID(env,

cls,

"aa",

"(Ljava/lang/String;)V");

jstring

info

=

(env)->NewStringUTF(env,

"out!");

(env)->CallVoidMethod(env,log,

jmid,info);

//调用方法

//释放string

(env)->ReleaseStringUTFChars(env,info,(env)->GetStringUTFChars(env,

info,

FALSE));

一、出现原因:

The method getIdStr() is undefined for the type Person 的意思是说:getIdStr()方法在Person类中没有定义。出现该提示的原因是因为在使用Person类或Person类的对象进行调用getIdStr()方法的时候,没有在Person类中找到对应的方法,编译无法通过。

二、解决方法:

方法1:检查getIdStr()方法的名字是否写错。

方法2:检查getIdStr()方法中是否存在参数,没有填写参数也会出现该提示。

方法3:检查Person类,是否含有该方法,没有该方法,需要在类中添加;如果有该方法,请仔细检查方法名和方法参数是否正确。

// 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;  

}

类型不一致。salary对象的id属性类型和你想set的id类型不一致。还有就是可能你传进来的只是id的内存地址。建议调用setid方法前打印下。

看你的报错信息,猜测你的setter方法是自己手写的,刚开始学java吗?其实可以自动生成对象的setter,getter方法的Alt+Shift+S,调用快捷方式,在点 r d出框选择就可以自动生成了。

以上就是关于如何判断callvoidmethod的参数methodid为空全部的内容,包括:如何判断callvoidmethod的参数methodid为空、java中如何从页面中获取值、将const char类型转换成jstring类型中的 NewStringUTF("GB2312");是何含义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存