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