JNI技术初探(二)

package com.zzw.demo1;

public class Hello {
	static {
		System.loadLibrary("hello");
	}
	private native String say(String str);

	private native float average(int[] a);

	private native int max(int[][] f);

	public static void main(String[] args) {
		Hello hello = new Hello();
		int[][] a = {{1,2,3,5},{4,100,5,6}};
		System.out.println(hello.max(a));
	}
}

这次,文件在包中,并且传入二维数组时的处理方法。

首先,进入java源码的路径,并且编译它

然后,将得到的头文件加入VS,并且编写C代码

#include<stdio.h>
#include "jni.h"
#include "com_zzw_demo1_Hello.h"

JNIEXPORT jstring JNICALL Java_com_zzw_demo1_Hello_say
(JNIEnv *env, jobject object, jstring str)
{
	const char *cstr = (*env)->GetStringUTFChars(env, str, NULL);
	if (NULL == cstr)
		return NULL;
	printf("this is C,I received: %s\n", cstr);
	(*env)->ReleaseStringUTFChars(env, str, cstr);
	char input[128];
	printf("请输入一个字符串:");
	scanf("%s", input);
	return (*env)->NewStringUTF(env, input);
}

JNIEXPORT jfloat JNICALL Java_com_zzw_demo1_Hello_average
(JNIEnv *env, jobject object, jintArray array)
{
	jint *carray = (*env)->GetIntArrayElements(env, array, NULL);
	if (NULL == carray)
		return 0;
	jsize length = (*env)->GetArrayLength(env, array);
	jfloat aver = 0;
	jint sum = 0;
	int i;
	for (i = 0;i < length;i++) {
		sum += carray[i];
	}
	aver = (jfloat)sum / length;
	return aver;
}

JNIEXPORT jint JNICALL Java_com_zzw_demo1_Hello_max
(JNIEnv *env, jobject object, jobjectArray array)
{
	int i, j;
	jint max;
	//获取数组行数
	int size1 = (*env)->GetArrayLength(env, array);
	printf("数组行数为:%d\n", size1);
	jarray myarray = (*env)->GetObjectArrayElement(env, array, 0);
	//获取数组列数
	int size2 = (*env)->GetArrayLength(env, myarray);
	printf("数组列数为:%d\n", size2);
	for (i = 0;i < size1;i++) {
		myarray = (*env)->GetObjectArrayElement(env, array, i);
		jint *element = (*env)->GetIntArrayElements(env, (jintArray)myarray, NULL);
		for (j = 0;j < size2;j++) {
			if (j == 0)
				max = element[0];
			if (max < element[j])
				max = element[j];
		}
	}
	return max;
}

最后,将该dll文件加入到eclipse中,并且在buildPath中注意添加dll的路径。

最后,运行即可得到结果

时间: 2024-03-31 21:05:09

JNI技术初探(二)的相关文章

JNI技术初探

首先写好Java代码 public class Hello { static { System.loadLibrary("hello"); } private native String say(String str); private native float average(int[] a); public static void main(String[] args) { Hello hello = new Hello(); String str = hello.say(&quo

Java通过jni技术支持c、c++调用使用整理

最近在公司搞终端5.0,说要对c++版本sdk封装一个java版的sdk,可是团队没有搞java的,于是赶鸭子上架,临时学习几天,整了一下:感觉还挺有意思的,于是整理一下: 为什么要使用java支持对c.c++的调用? 众所周知Java语言是一门支持跨平台解释型语言:#.java通过javac编译生成生成#.class字节码,运行过程依赖java虚拟机执行字节码生成虚拟机的执行指令,最终通过虚拟机操控所在平台,完成其设计的功能:其优点很明显,支持跨平台:其缺点也很明显,执行效率底,并且不支持平台

使用jni技术进行android应用签名信息核查及敏感信息保护

最近业余时间写了一款应用<摇啊摇>,安智.安卓.360等几个应用商店已经陆续审核通过并上线.从有想法到最终将产品做出来并发布,断断续续花了近二个半月的业余时间,总体来讲还算顺利,虽然期间也遇到几个小技术难点,最后解决的还算满意.今天说下其中一个小技术难点,现在想想这个小技术难点也很平常,但还是分享出来,希望对有相同疑惑的同学有帮助. 因为java语言自身特性的原因,导致android程序很容易被反编译,虽然可以采用代码混淆的方式,但是如果用了第三方库,混淆脚步编写不好,代码混淆后又会出现程序运

11.Cocos2dx2.2下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方案。

<span style="font-family: Arial, Helvetica, sans-serif;">步骤一:导入JniHelper.h头文件.</span> #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "JniHelper.h" #endif: 此时会遇到JniHelper.h头文件无法找到的问题,需要添加附加包含目录即可解决问题.具体操作步骤如下:右击项目-

网页三维地图技术初探

根据是否需要加载地图服务器中的资源将网页三维地图技术分为两大类: 一.需要服务器配合的 1.cesiumjs    网址:http://www.cesiumjs.org 许可证:Apache 2.0 license 可以在调整经纬度,但是不能调整人眼的视角,也就是地球的轴线不能在显示器的平面中旋转. 优点:可以绘制三维数据,圆柱圆锥.卫星 2.openwebglobe 网址:http://www.openwebglobe.org/ 许可证:Open source licenced under M

JNI技术基础(2)——从零开始编写JNI代码

书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h 在Linux控制台输入命令:javah –jni HelloWorld 生成HelloWorld.h头文件 //HelloWorld.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header

深入探索spring技术内幕(二): 剖析spring管理Bean的原理与配置

求二叉树的宽度和深度 给定一个二叉树,获取该二叉树的宽度和深度. 例如输入 a / \ b c / \ / \ d e f g 返回3. 详细描述: 接口说明 原型: int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight) 输入参数: head 需要获取深度的二叉树头结点 输出参数(指针指向的内存区域保证有效): pulWidth 宽度 pulHeight 高度 返回值: 0 成功 1 失败

c++实现加密和解密算法以及JNI技术的应用实例

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

cygwin+ndk+eclipse下JNI技术入门

1.JNI的编写步骤1)编写带有native 声明的java类.2)编译java文件成class类3)使用javah -jni com.ikags.project.XXXX 编译成.h文件4)使用C/C++编写代码5)编写makefile文件,将.h和.c(.cpp)文件编译成.dll(.so)文件6)将.dll(.so)文件提供给项目,用system.loadLibrary方法调用. 2.编写makefile文件make执行时,自动寻找Makefile(makefile)文件,然后执行编译工作