`

C/C++调用Java代码 创建对象、字符串操作

 
阅读更多

back>>

1. java对象的创建的步骤
    - 函数NewObject可以创建java对象
    - 用GetMethodID方法取得构造方法的jmethodID,传入方法名称设定为"<init>"表示取的是构造方法的methodID
    - 构造方法的方法返回值类型的签名始终为Void
    - 例子:

    TestNative.java

package video1;

import java.util.Date;

public class TestNative {
	public int number = 100;

	public int signTest(int i, Date date, int[] arr) {
		System.out.println("Sign Test");
		return 0;
	}
	public TestNative() {
		System.out.println("Default Constructor!");
	}
	public TestNative(int i, int j) {
		this.number = i;
		System.out.println("TestNative Constructor: i:" + i);
	}

	// native关键字修饰的方法,其内容是C/C++编写的,java中不必为它编写具体的实现
	public native void sayHello();

	public static void main(String[] args) {
		System.loadLibrary("NativeCode");
		TestNative tn = new TestNative();
		tn.sayHello();
	}
}

     C/C++代码片段:

    //找到class
    jclass clazz_Kong=env->FindClass("video1/TestNative");
    //获得构造函数ID
    jmethodID MID_Kong=env->GetMethodID(clazz_Kong,"<init>","(II)V");
    //生成对象 最后两个参数是构造函数的参数,可以不写
    jobject obj_Kong = env->NewObject(clazz_Kong,MID_Kong,1999l,2l);

    //调用属性
    jfieldID Kong_num = env->GetFieldID(clazz_Kong,"number","I");
    jint numberKong= env->GetIntField(obj_Kong,Kong_num); 
    cout<<"Kong:"<<numberKong<<endl;

     - 另一种方法 AllocObject(不常用)


2. 在C/C++本地代码中访问JAVA的String字符串对象
    - 在java中,使用的字符串String对象不论是中文还是英文符号,一个字符总是占两个字节
    - java通过JNI接口可以将java的字符串转换到C/C++中的宽字符串(wchar_t*),或是传回一个UTF-8的字符串(char*)到C/C++.
    - 反过来,C/C++可以通过一个宽字符串,或是一个UTF-8编码的字符串来创建一个java端的String对象

    - 函数GetStringChars   GetStringUTFChars
      这两个函数用来取得某个jstring对象相关的Java字符串。
      分别可以取得UTF-16编码的宽字符串(jchar*)跟UTF-8编码的字符串(char*)。
      例如:
      const jchar* GetStringChars(jstring str,jboolean* copied)
      const char* GetStringUTFChars(jstirng str,jboolean* copied)
      第一个参数传入一个指向java中的String对象的jstring变量,第二个参数传入一个jboolean的指针,是用来标识是否对java的String对象进行了拷贝。如果传入这个jboolean指针不是NULL,则它会给该指针所指向的内存传入JNI_TRUE或JNI_FALSE标识是否进行了拷贝。传入NULL表示不关心是否拷贝字符串,它就不会给jboolean*指向的内存赋值
      这两个函数分别都会有两个不同的动作:
      1.开新内存,然后把java中的string拷贝到这个内存中,然后返回指向这个内存地址的指针
      2.直接返回指向java中String内存的指针,这个时候千万不要改变这个内存的内容,这将破坏String在java中始终是常量这个原则。   
      使用这两个函数取得的字符串,在不使用的时候,要使用ReleaseStringChars/ReleaseStringUTFChars来释放拷贝的内容,或是释放对java的String对象的引用
      ReleaseStringChars(jstring jstr,const jchar * str);
      ReleaseStringUTFChars(jstring jstr,const char * str);
      第一个参数指定一个jstring变量,即是要释放的本地字符串的来源,第二个参数就是要释放的本地字符串


    - 函数GetStringCritical
      为了增加直接传回指向java字符串的指针的可能性(而不是拷贝),JDK1.2出来了新的函数

      GetStringCritical/ReleaseStringCritical.
      在GetStringCritical/ReleaseStringCritical之间是一个关键区,在关键区千万不要出现中断操作,或是在JVM中分配任何新对象,否则会造成JVM死锁
      虽说这个函数会增加直接传回指向java字符串指针的可能性,不过还是会根据实际情况传回拷贝过的字符串
      不支持GetStringUTFCritical

    - 函数GetStringRegion/GetStringUTFRegion
      动作:把java字符串的内容直接拷贝到C/C++的字符数组中。在呼叫这个函数之前必须有一个C/C++分配出来的字符串,然后传入到这个函数中进行字符串的拷贝(此函数不分配内存)
      例子:
      //拷贝Java字符串并以UTF-8编码传入buffer
      GetStringUTFRegion(jstring str,jsize start,jsize len,char* buffer);
      //拷贝java字符串并以UTF-16编码传入buffer
      GetStringRegion(jstring str, jsize start,jsize len,jchar* buffer);



3. 在C/C++本地代码中创建JAVA的String字符串对象

    - 函数

    jstring NewString(const jchar* str,jsize len);
    jstring NewStringUTF(const char * str);
    //取得字符串的长度
    jsize GetStringLength(jstring str);
    jsize GetStringUTFLength(jstring str);

4. 字符串操作完整示例

    TestNative1.java

package video1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class TestNative1 {

	public String message = null;

	public native void callCppFunction();

	public static void main(String[] args) throws IOException {
		System.loadLibrary("NativeCode");
		BufferedReader reader = new BufferedReader(new InputStreamReader(
				System.in));
		String str = reader.readLine();
		TestNative1 obj = new TestNative1();

		obj.message = str;
		obj.callCppFunction();
		System.out.println("java output:" + obj.message);
	}
}

     cpp.cpp

#include "video1_TestNative1.h"
#include "windows.h"
#include <iostream>
using namespace std;

JNIEXPORT void JNICALL Java_video1_TestNative1_callCppFunction(JNIEnv * env, jobject obj){
	
	jclass native_clazz = env->GetObjectClass(obj);
	//得到jfieldID
	jfieldID fieldID_msg = env->GetFieldID(native_clazz,"message","Ljava/lang/String;");

	//得到java字符串
	jstring j_msg =(jstring) env->GetObjectField(obj,fieldID_msg);
	//将java字符串转换为本地字符串
	const jchar * jstr = env->GetStringChars(j_msg,NULL);
	MessageBoxW(NULL,(const wchar_t*)jstr,L"Title",MB_OK);//对话框弹出
	env->ReleaseStringChars(j_msg,jstr);//释放资源
	//修改字符串
}
 

 

  • 大小: 10.5 KB
分享到:
评论

相关推荐

    quartus ii安装教程.docx

    quartus ii安装教程

    tensorflow_probability-0.3.0-py2.py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    tensorflow_privacy-0.5.1-py3-none-any.whl

    算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    tensorflow_recommenders-0.7.3-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    asp代码ASP基于WEB实验室设备管理系统设计(源代码+论文)

    asp代码ASP基于WEB实验室设备管理系统设计(源代码+论文)本资源系百度网盘分享地址

    JAVA毕业设计之springboot057洗衣店订单管理系统(springboot+mysql)完整源码.zip

    这个资源是一个基于Spring Boot和MySQL的洗衣店订单管理系统的完整源码。它包括了所有的源代码文件,以及一个详细的文档,可以帮助你理解和运行这个系统。这个系统的主要功能包括:用户注册和登录,下单,查看订单,修改订单,删除订单等。用户可以在系统中选择洗衣服务,然后提交订单。系统会自动计算订单的总价,并将其显示在用户的订单列表中。用户还可以查看自己的历史订单,以及每个订单的详细信息。此外,系统还包括了一个管理员模块。管理员可以查看所有的订单,以及对订单进行管理。他们可以修改订单的状态,例如将订单标记为已完成,或者取消订单。这个系统使用了Spring Boot框架,这是一个非常流行的Java开发框架,它可以帮助你快速地开发和部署应用程序。同时,系统也使用了MySQL数据库,这是一个广泛使用的关系型数据库,它可以存储大量的数据,并提供高效的查询功能。总的来说,这个资源是一个非常完整的洗衣店订单管理系统的源码,它可以帮助你理解如何使用Spring Boot和MySQL来开发一个实际的应用程序。无论你是正在学习Java编程,还是已经有一定的开发经验,都可以从这个资源中学到很多有用的知识和技能。

    网络药理学、代谢组学的应用

    网络药理学、代谢组学的应用和课题设计方案”基于PI3K-AKT-mTOR通路研究 淫羊藿苷影响成骨细胞糖酵解促进骨形成的机制“

    毕业论文知识图谱构建平台的python后端。模型相关在这个模块完成,深度学习基于pytorch.zip

    人工智能毕业设计&课程设计

    tensorflow_transform-0.1.4-py2-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ftqqzx.zip

    ftqqzx.zip

    高级网络人才培训专家-X00070004 第31章 配置帧中继

    高级网络人才培训专家_X00070004 第31章 配置帧中继

    tensorflow_transform-0.1.8-py2-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于ssm+vue酒店预约及管理系统.zip

    基于ssm+vue酒店预约及管理系统.zip

    基于ssm+vue的宠物店系统.zip

    基于ssm+vue的宠物店系统.zip

    基于ssm省出口基地公共信息服务平台.zip

    基于ssm省出口基地公共信息服务平台.zip

    分子模拟技术在传统药物设计领域应用20160121.pdf

    分子模拟技术在传统药物设计领域应用20160121

    LS-201510-DS应用案例.pdf

    LS-201510-DS应用案例

    KEPServerEX V6.15 2024最新版

    最新版 [EX 6.15] KEPServerEX-6.15.132.0。 产品下载一次将运行 2 小时,可以通过停止和启动运行时服务随时重复演示期。

    基于Spring Cloud的Spark开发平台设计源码

    这是一个基于Spring Cloud Hoxton、Spring Boot 2.3、OAuth2、Security、Nacos、flowable、vue-element的Spark开发平台设计,使用Java语言开发,包含1018个文件。主要文件类型包括268个Java源文件、206个JavaScript文件、165个PNG图片文件、147个HTML文件、48个XML文件、26个CSS文件、24个gitignore文件、18个YAML文件和14个JSON文件。该项目是一个前后端分离的脚手架平台,提供了丰富的功能模块,包括系统管理(组织机构、角色用户等),旨在为开发者提供一个高效、便捷的开发环境。

    tensorflow_privacy-0.7.0-py3-none-any.whl

    算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

Global site tag (gtag.js) - Google Analytics