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("I am zzw,nice to meet you JNI");
		System.out.println(str);
		int[] a = {1,2,3,4,5};
		System.out.println(hello.average(a));
	}
}

然后在命令行下编译它,javac Hello.java,并且得到其对应的C语言头文件,javah Hello,即可得到头文件如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class Hello */

#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif

	/*
	* Class:     Hello
	* Method:    say
	* Signature: (Ljava/lang/String;)Ljava/lang/String;
	*/
	JNIEXPORT jstring JNICALL Java_Hello_say
		(JNIEnv *, jobject, jstring);

	/*
	* Class:     Hello
	* Method:    average
	* Signature: ([I)F
	*/
	JNIEXPORT jfloat JNICALL Java_Hello_average___3I
		(JNIEnv *, jobject, jintArray);

#ifdef __cplusplus
}
#endif
#endif

然后打开VS,写入C代码,同时添加jni.h和jni_md.h两个头文件,

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

JNIEXPORT jstring JNICALL Java_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_Hello_average___3I
(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;
}

最后,点击编译生成dll文件,加到java文件夹中,运行java Hello,即可成功运行。

时间: 2024-11-03 02:53:29

JNI技术初探的相关文章

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 h

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

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

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

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

使用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头文件无法找到的问题,需要添加附加包含目录即可解决问题.具体操作步骤如下:右击项目-

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)文件,然后执行编译工作

网页三维地图技术初探

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

JNI技术

1. JNI 介绍 Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分. 在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能.通常有以下几种情况我们需要使用JNI来实现. (没有,有,速度) 标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的 程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用