1、在C/C++本地代码中创建Java对象
主要使用的方法就是env->NewObject(jclass,jmethod)
例如:使用java中的java.util.Date对象的getTime()方法进行时间的输出
JNIEXPORT void JNICALL Java_jni_TestNative_sayhello(JNIEnv *env, jobject object){
//调用java中已经有的类,进行输出
//加载java中的Date类
jclass clazz_date=env->FindClass("java/util/Date");
//得到构造方法的ID
jmethodID date_id=env->GetMethodID(clazz_date,"<init>","()V");
//创建Date实例对象
jobject date=env->NewObject(clazz_date,date_id);
//调用Date中的getTime()方法
jmethodID gettime_id=env->GetMethodID(clazz_date,"getTime","()J");
//执行getTime()方法
jlong time=env->CallLongMethod(date,gettime_id);
cout<<time<<endl;
}
2、在C/C++本地代码中访问Java的String对象
例如加载代码中的:
package jni;
import java.util.Date;
public class TestNative {
public native void sayhello();
public String name="zhangsan";
public int number=10;
public double max(double num1,double num2){
return num1>num2?num1:num2;
}
// Father p=new Child();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary("NativeCode");
TestNative tst=new TestNative();
tst.sayhello();
System.out.println(tst.number);
}
}
在C++文件中获取String name="zhangsan";
JNIEXPORT void JNICALL Java_jni_TestNative_sayhello(JNIEnv *env, jobject object){
//首先得到jclass对象,是后面得到属性和方法ID的基础
jclass clazz_TestNative=env->GetObjectClass(object);
//对java中字符串的调用
//得到那么的jfieldID
jfieldID name_id=env>GetFieldID(clazz_TestNative,"name","Ljava/lang/String;");
//得到该属性的值
jstring name=(jstring)env->GetObjectField(object,name_id);
const jchar* char_name=env->GetStringChars(name,NULL);
const char* name1=env->GetStringUTFChars(name,NULL); //zhangsan
cout<<char_name<<endl;
cout<<name1<<endl;
//对字符串进行截取
jchar * a=new jchar[10];
char* b=new char[100];
env->GetStringUTFRegion(name,0,3,b);
cout<<b<<endl;
env->GetStringRegion(name,0,3,a);
cout<<a <<endl;
//在不使用的时候进行本地字符串回收
env->ReleaseStringChars(name,char_name);
env->ReleaseStringUTFChars(name,name1);
//其中的jstring并不是一个字符串,我们需要对jstring进行相应的函数操作
1、const jchar *GetStringChars(jstring str, jboolean*isCopy)
将一个jstring对象,转换为(UTF-16)编码的宽字符串(jchar*)。
2、 const char *GetStringUTFChars(jstring str,jboolean *isCopy)
将一个jstring对象,转换为(UTF-8)编码的字符串(char*)。
这两个函数的参数中,第一个参数传入一个指向Java 中String对象的jstring引用。第二个参数传入的是一个jboolean的指针,其值可以为NULL、JNI_TRUE、JNI_FLASE。
如果为JNI_TRUE则表示开辟内存,然后把Java中的String拷贝到这个内存中,然后返回指向这个内存地址的指针。
如果为JNI_FALSE,则直接返回指向Java中String的内存指针。这时不要改变这个内存中的内容,这将破坏String在Java中始终是常量的规则。
如果是NULL,则表示不关心是否拷贝字符串。
使用这两个函数取得的字符,在不适用的时候,要分别对应的使用下面两个函数来释放内存。
3、RealeaseStringChars(jstring jstr, const jchar*str)
4、RealeaseStringUTFChars(jstring jstr, constchar* str)
第一个参数指定一个jstring变量,即要释放的本地字符串的资源
第二个参数就是要释放的本地字符串
3、在C/C++本地代码中创建Java的String对象
介绍一些方法
jstring string=env->newStringUTF(const char*);创建一个jstring对象
jstring string=env->newString(const jchar*);
jsize len=env->GetStringUTFLength(jstring);获取jstring 的长度
jszie len=env->GetStringLength(jstring);
jstring string=env->GetStringUTFChars(const char* );
jstring string=env->GetStringChars(const jchar*);字符串转为jstring
本地创建的字符串可以封装为jstring类型,然后传给java
package jni;
import java.util.Date;
public class TestNative {
public native void sayhello();
public String name="zhangsan";
public int number=10;
public double max(double num1,double num2){
return num1>num2?num1:num2;
}
// Father p=new Child();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary("NativeCode");
TestNative tst=new TestNative();
tst.sayhello();
System.out.println(tst.number);
System.out.println(tst.name);
}
}
C++本地代码,可以修改name的值
JNIEXPORT void JNICALL Java_jni_TestNative_sayhello(JNIEnv *env, jobject object){
//首先得到jclass对象,是后面得到属性和方法ID的基础
jclass clazz_TestNative=env->GetObjectClass(object);
const char* subject="chinese";创建本地的字符串
jstring sub=env->NewStringUTF(subject);将本地的字符创封装为jstring
jsize len=env->GetStringUTFLength(sub);得到字符串的长度
jfieldID id_name1=env>GetFieldID(clazz_TestNative,"name","Ljava/lang/String;");
env->SetObjectField(object,id_name1,sub);
}
java 代码如何生成window脚本 java生成本地代码
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
如何实现Java结合Python写代码
实现Java结合Python写代码
Java Python java -
代码生成脚本
代码生成脚本是一个自动化工具,用于根据特定的规则或模板生成源代码。它可以帮助开发者快速创建重复性高的代码片段,提高开发我哦!!!
程序人生 软件工程 chatgpt 代码生成 开发人员 -
staruml 生成java staruml如何生成代码
在用StartUML工具生成类图后,在类图上单击鼠标右键弹出如下界面: 图1 当选择“Generate Code...”菜单时,会弹出如下错误对话框
staruml 生成java Code Java 右键