添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
坏坏的眼镜  ·  【Unity】2D ...·  2 周前    · 
开朗的领带  ·  守文化之重 创时代之新·  4 月前    · 
开朗的硬盘  ·  吕型伟_百度百科·  9 月前    · 
无邪的仙人球  ·  共青团·  1 年前    · 

JNI开发有时需要C/C++传递对象到Java,此篇主要讲解C/C++传递Student对象到Java;

1. 定义com.niubashaoye.simple.jni.StuInfo类

public class StuInfo {
	private int stuId;
	private String stuName;
	private int stuAge;
	private String className;
	public StuInfo(int stuId, String stuName, int stuAge, String className) {
		super();
		this.stuId = stuId;
		this.stuName = stuName;
		this.stuAge = stuAge;
		this.className = className;
          //getter()
          //setter()
	@Override
	public String toString() {
		return "StuInfo [stuId=" + stuId + ", stuName=" + stuName + ", stuAge=" + stuAge + ", className=" + className
				+ "]";

 2. 添加native函数

public class JNITools {
	static {
		System.loadLibrary("TestDemo");
	 * 获取学生信息
	 * @param stuInfo
	 * @return
	public native StuInfo getStuInfo();

3. C/C++文件

 3.1 添加StuInfo结构体

typedef struct {
	int stuId;
	char stuName[50];
	int stuAge;
	char className[50];
} StuInfo;

3.2 获取StuInfo对象

JNIEXPORT jobject JNICALL Java_com_niubashaoye_simple_jni_JNITools_getStuInfo(
		JNIEnv *env, jobject obj) {
	//给StuInfo结构体赋值
	StuInfo stuInfo;
	stuInfo.stuId = 100123;
	const char *name = "我是我自己!";
	strcpy(stuInfo.stuName, name);
	const char *className = "高三六班";
	strcpy(stuInfo.className, className);
	//获取jclass的实例
	jclass jcs = env->FindClass("com/niubashaoye/simple/jni/StuInfo");
	//获取StuInfo的字段ID
	jfieldID fileId = env->GetFieldID(jcs, "stuId", "I");
	jfieldID nameId = env->GetFieldID(jcs, "stuName", "Ljava/lang/String;");
	jfieldID ageId = env->GetFieldID(jcs, "stuAge", "I");
	jfieldID classId = env->GetFieldID(jcs, "className", "Ljava/lang/String;");
	//创建StuInfo对象
	jobject stuObje = env->AllocObject(jcs);
	//设置变量值
	env->SetIntField(stuObje, fileId, stuInfo.stuId);
	env->SetIntField(stuObje, ageId, stuInfo.stuAge);
	env->SetObjectField(stuObje, nameId, env->NewStringUTF(stuInfo.stuName));
	env->SetObjectField(stuObje, classId, env->NewStringUTF(stuInfo.className));
	return stuObje;
4. Java调用native函数
StuInfo stuInfo = jniTools.getStuInfo();
Toast.makeText(getApplicationContext(), stuInfo.toString(), Toast.LENGTH_SHORT).show();

代码下载:NDK开发传递对象作为参数_ndk编译参数-Android代码类资源-CSDN下载

JNI开发有时需要C/C++传递对象到Java,此篇主要讲解C/C++传递Student对象到Java;1. 定义com.niubashaoye.simple.jni.StuInfo类public class StuInfo { private int stuId; private String stuName; private int stuAge; privat... The C side-Compiling the Library 40 1、 建立标准C工程Cpro,并生成dll文件 40 1) 将生成的头文件test_Hello.h拷贝到C工程Cpro下 40 2) 编写C类Hello.c,内容为: 40 3) 在C工程Cpro下建立hello.def文件(用于定义导出的函数),内容为: 40 4) 在C工程Cpro下建立makefile文件,内容为: 40 5) Make Targets 40 6) Make Targets视图下双击step1,在C工程Cpro下生成hello.o 文件。 41 7) Make Targets视图下双击step1,在C工程Cpro下生成hello.dll 文件。 41 2、 JAVA调用DLL 41 1) 将hello.dll拷贝到Java工程JavaHello下。 41 2) 运行Hello.java,则可以看到输出结果: 41 1) 将Hello.c改为Hello.cpp 41 2) 将makefile内容改为: 41 3) 其他的几乎都不用改变也可以。 42 评论: 42 VI. c++如何调用java程序 51 DemoMain.java内容如: 51 采用vc6++ IDE,采用JNI技术实现。 51 1、 编译时 51 2、 运行时 51 程序的关键在 53 VII. JNI 53 一、 定义 53 二、 设计目的 54 三、 书写步骤 54 1) 编写java程序:这里以HelloWorld为例。 54 2) 编译 55 3) 生成扩展名为h的头文件 55 4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。 56 5) 生成动态库 56 6) 运行程序 java HelloWorld就ok. 56 四、 调用中考虑的问题 56 1) java和c是如何互通的? 57 2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是bytearray的话,作如下处理得到buffer: 58 VIII. C/C++调用JAVA类 58 一、 加载虚拟机: 59 二、 获取指定对象的类定义: 59 三、 获取要调用的方法: 59 四、 调用JAVA类方法: 60 五、 获得类属性的定义: 60 六、 数组处理: 60 七、 异常: 60 八、 多线程调用 61 Java代码 61 命令行运行:javap -s -p MyTest ,输出: 62 C代码testjava.c: 62 编译: 65 运行结果: 65
JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ https://blog.csdn.net/niuba123456/article/details/80994168
2、编译声明的Java文件: 因为在源码中使用了package的命令,所以编译的时候需要用"-d ."参数,其中"."表示在当前目录生成 jnilib文件夹来存放编译生成.class文件 javac -d . TestJNI.java javah jnilib.TestJNI 生成jnilib_TestJNI.h的文件 3、c语言来实现函数java里定义的native方法,和***.h文件中的接口名称保持一致
​类似之前我写过的两篇文章:一篇介绍了在JNI中基础类型int的传值方式;一篇详细梳理了在JNI层中多维数组的多种传值方式。 JNI内两种方式从C/C++传递一维、二维、三维数组数据至Java层详细梳理_nanke_yh的博客-CSDN博客 JNI内形参从C代码中获取返回值并返回到Java层使用-CSDN博客 这篇则主要是讲JNI中String类型的数据如何通过参数的形式传递数据值。
第三方C++函数接口为 int api_get_logfile(Struct fileinfo tfile),参数是个结构体,且套了另一个结构体: struct fileinfo{  char *fullpath;  int filesize;  int filemode;  struct disnode *tnode; struct disnode{  int nu
JNI jni = new jni();//实例化JNI对象 jni.helloFromC("helloworld");//调用本地方法 #JNI.java: public class JNI{ static{... public native static String sayHello(String text); public static void main(String[] args) {
JNIJava Native Interface)是一种技术,它可以让Java程序与C(或C++)程序进行互相调用。 在JNI中,我们可以使用Java的native关键字声明一个方法,该方法的具体实现在C(或C++)语言中完成。然后,我们可以通过JNI提供的接口函数,在Java和C(或C++)之间进行数据和方法的传递。 在Java代码中,我们首先需要使用System.loadLibrary()方法加载C(或C++)动态链接库。然后,通过Java的native方法调用C(或C++)中的函数,实现Java与C(或C++)的互相调用。 在C(或C++)代码中,我们需要编写与Java声明的native方法对应的具体实现代码。可以使用JNI提供的接口函数,通过JNIEnv结构体来访问Java对象、方法和属性。 Java与C(或C++)之间的数据传递可以通过JNI提供的接口函数来完成。我们可以使用JNI的函数将Java的基本数据类型与C(或C++)的对应类型进行转换,例如将int转换为jint、jint转换为int等等。同时,我们也可以使用JNI函数来处理复杂的数据结构,例如将Java的字符串转换为C(或C++)的字符串,或将Java的数组转换为C(或C++)中的数组。 在实际应用中,JNI可以用于优化性能,因为C(或C++)代码相对于Java代码可以更高效地执行某些操作。同时,JNI也可以用于与现有的C(或C++)库进行集成,以利用已有的功能。 总之,JNI提供了一种机制,可以在Java和C(或C++)之间实现互相调用,使得我们可以充分利用两者各自的优势,在应用开发中更加灵活和高效。
<servlet> <servlet-name>ServletDemo1</servlet-name> <servlet-class>cn.heima.chapter3.ServletDemo1</servlet-class> </servlet> <servlet-mapping>// <servlet-name>ServletDemo1</servlet-name> <url-pattern>/ServletDemo1</url-pattern> </servlet-mapping> 请问我注释的那一行为什么总是显示错误啊 make: *** No rule to make target `jni/NDKDemo2.cpp', needed by `.../objs/NDKDemo/NDKDemo2.o'. stop kkktttvvvv: 确实是Android.mk中的LOCAL_SRC_FILES属性值的文件路径问题 Android的img镜像文件打开 a515370: 我想要修改 Gradle-Wrapper详解 AndroidStuido需要设置字符转移,这句是为啥,又是啥意思?