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) {
JNI(Java 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++)之间实现互相调用,使得我们可以充分利用两者各自的优势,在应用开发中更加灵活和高效。
make: *** No rule to make target `jni/NDKDemo2.cpp', needed by `.../objs/NDKDemo/NDKDemo2.o'. stop
kkktttvvvv:
Android的img镜像文件打开
a515370:
Gradle-Wrapper详解