码迷,mamicode.com
首页 > 其他好文 > 详细

JNI技术初探(二)

时间:2015-09-01 00:18:35      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

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的路径。

技术分享

最后,运行即可得到结果

技术分享


JNI技术初探(二)

标签:

原文地址:http://my.oschina.net/zzw922cn/blog/499809

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!