java空类型方法无参_Java调用本地C++方法【进阶:可简单调用各种类型的方法,无参,各种形参,无返回值,各种返回值】...

一、无参无返回值

Java代码:

package com.lvshitech.javaandc;

public class MainCls {

// 无参无返回值

public native void sayHello();

}

C++:(如果不会编写这个C++程序,就使用Java语言编写,然后自动编译生成这个.h文件再拷贝进来,具体操作方法见:http://www.cnblogs.com/josephcnblog/articles/7771848.html)

#include

#include "com_lvshitech_javaandc_MainCls.h"

#include

#include

#include

using namespace std;

// 无参无返回值的C++本地方法

JNIEXPORT void JNICALL Java_com_lvshitech_javaandc_MainCls_sayHello(JNIEnv *env, jobject obj)

{

cout << "Java调用无参无返回值的C++本地方法" << endl;

}

Java测试代码:

package com.lvshitech.javaandc;

public class MainCls {

// 无参无返回值

public native void sayHello();

// 测试

public static void main(String[] args) {

// 加载本地动态库

System.loadLibrary("JavaAndC");

// 创建MainCls类对象

MainCls mainCls = new MainCls();

// 调用本地C++动态库方法

mainCls.sayHello();

}

}

执行:

e9c9d639ce761073f7bf44caec01c381.png

二、无返回值有简单形参

(1)int 类型

Java代码:

package com.lvshitech.javaandc;

public class MainCls {

// int类型的参数无返回值

public native void sayHello(int num);

}

C++代码:

#include

#include "com_lvshitech_javaandc_MainCls.h"

#include

#include

#include

using namespace std;

// 无参无返回值的C++本地方法

JNIEXPORT void JNICALL Java_com_lvshitech_javaandc_MainCls_sayHello(JNIEnv *env, jobject obj, jint num)

{

cout << "Java调用int类型的参数无返回值的C++本地方法:num = " << num << endl;

}

Java测试代码:

package com.lvshitech.javaandc;

public class MainCls {

// int类型的参数无返回值

public native void sayHello(int num);

// 测试

public static void main(String[] args) {

// 加载本地动态库

System.loadLibrary("JavaAndC");

// 创建MainCls类对象

MainCls mainCls = new MainCls();

// 调用本地C++动态库方法

mainCls.sayHello(100);

}

}

执行:

b6f62f9e0e96d8f9a23eb8b7479aa574.png

(2)int[] 数组类型

Java代码:

package com.lvshitech.javaandc;

public class MainCls {

// int[]数组类型的参数无返回值

public native void sayHello(int ... num);

}

C++代码:

#include

#include

#include "com_lvshitech_javaandc_MainCls.h"

#include

#include

#include

using namespace std;

// 无参无返回值的C++本地方法

/*

JNIEnv *env,代表了 Java 虚拟机 Java VM,代表了 Java 的环境,通过指针 *env 可以对 Java 端代码进行操作,是Java和本地语言(比如C++)通信的桥梁,

例如,创建Java类中的对象,调用Java对象的方法,获取Java对象中的属性等等,

JNIEnv 的指针会被 JNI 传入到本地方法的实现函数中来对Java端的代码进行操作。查看 JNIEnv 可以看到各种各样的方法

*/

JNIEXPORT void JNICALL Java_com_lvshitech_javaandc_MainCls_sayHello(JNIEnv *env, jobject obj, jintArray dat)

{

cout << "Java调用int[]数组类型的参数无返回值的C++本地方法:" << endl;

// 声明数组指针

jint *arr;// 本地类型的jint对应java类型的int,其他类型请查看数据类型映射表

arr = (env)->GetIntArrayElements(dat, false);// 从虚拟机的环境变量env中获取传递过来的数组dat并赋值给数组指针

if (!arr)

{

cout << "数组为空!" << endl;

}

else

{

// 遍历数组

for (int i = 0; i < 5; i++)

{

cout << i + 1 << " : " << arr[i] << endl;

}

}

// 释放资源

(env)->ReleaseIntArrayElements(dat, arr, 0);

}

Java测试代码:

package com.lvshitech.javaandc;

public class MainCls {

// int[]数组类型的参数无返回值

public native void sayHello(int ... num);

// 测试

public static void main(String[] args) {

// 加载本地动态库

System.loadLibrary("JavaAndC");

// 创建MainCls类对象

MainCls mainCls = new MainCls();

// 调用本地C++动态库方法

int num[] = {10, 11, 12, 13, 14};

mainCls.sayHello(num);

}

}

执行:

f99b8832307c7f2f525a04f340f50bb7.png

改变数组大小:int num[] = {10, 11, 12, 13, 14, 15, 16};

输出和上面一样,减少数组大小:int num[] = {10, 11, 12};

输出:

9fee71ac742e3225b7c88fc239f4f91a.png

(3)返回 int,无形参

Java代码:

package com.lvshitech.javaandc;

public class MainCls {

// 返回 int,无形参

public native int sayHello();

}

C++代码:

#include

#include "com_lvshitech_javaandc_MainCls.h"

#include

#include

#include

using namespace std;

// 返回 int,无形参(JNIEnv *env, jobject obj,是Java环境自带的形参,这里说的是用户自己传入的形参)

JNIEXPORT jint JNICALL Java_com_lvshitech_javaandc_MainCls_sayHello(JNIEnv *env, jobject obj)

{

return 100;

}

Java测试代码:

package com.lvshitech.javaandc;

public class MainCls {

// 返回 int,无形参

public native int sayHello();

// 测试

public static void main(String[] args) {

// 加载本地动态库

System.loadLibrary("JavaAndC");

// 创建MainCls类对象

MainCls mainCls = new MainCls();

// 调用本地C++动态库方法

int ret = mainCls.sayHello();

System.out.println("调用C++本地方法返回的值:" + ret);

}

}

执行:

599255199a40ca6ee1249c54912bf790.png

(4)有返回值(int[]),有形参(int[])

Java代码:

package com.lvshitech.javac;

public class MainCls {

public native int[] sayHello(int ... inArr);

}

C++代码:

#include

// 导入有关JNI的库文件以及Java函数生成的本地.h文件

#include "com_lvshitech_javac_MainCls.h"

#include

#include

#include

using namespace std;

/*

inArr:Java传入的int类型的数组

返回:jintArray,int类型的数组

实现数组元素 +10 的操作

*/

JNIEXPORT jintArray JNICALL Java_com_lvshitech_javac_MainCls_sayHello

(JNIEnv *env, jobject obj, jintArray inArr)

{

// 获取传入的数组大小

jsize inArrLen = env->GetArrayLength(inArr);

// 如果数组为空数组,则直接结束

if (inArrLen == 0)

{

return NULL;

}

// 声明一个jint*类型的指针变量,用以接收传入的数组,遍历数组+10操作

jint* tmp = env->GetIntArrayElements(inArr, false);

for (int i = 0; i < inArrLen; i++)

{

tmp[i] += 10;

}

// 创建一个jintArray的空数组,用以接收+10后的新数组元素

jintArray retArr = env->NewIntArray(inArrLen);

// 接收新数组元素,SetIntArrayRegion(空数组,数组起始下标,数组大小,新数组指针变量)

env->SetIntArrayRegion(retArr, 0, inArrLen, tmp);

// 释放资源

env->ReleaseIntArrayElements(inArr, tmp, 0);

// 返回数组

return retArr;

}

测试代码:

package com.lvshitech.javac;

public class MainCls {

public native int[] sayHello(int ... inArr);

public static void main(String[] args) {

System.loadLibrary("demo");

MainCls mcls = new MainCls();

int[] inArr = {-14, 2, 34, 5, 1, 89};

int[] retArr = mcls.sayHello(inArr);

if(retArr != null && retArr.length > 0) {

for (int i=0; i

System.out.println((i+1) + " : " + retArr[i]);

}

} else {

System.out.println("JNI返回的数组长度为0");

}

}

}

执行:

0116eb05a68b98b4ce44ce915eaf49fc.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值