文档章节

JNI技术初探

断桥残雪断桥残雪
 断桥残雪断桥残雪
发布于 2015/08/31 20:44
字数 322
阅读 34
收藏 0

首先写好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,即可成功运行。

© 著作权归作者所有

下一篇: Python学习四
断桥残雪断桥残雪
粉丝 53
博文 139
码字总数 94909
作品 0
广州
程序员
私信 提问
Android jni初探

因为我们是系统开发,所以所需要调用的jni可以直接在系统下编译,我就直接写jni文件,首先我需要一个.h文件,主要是jni的参数,参考java参数转jni参数的使用方法。 / DO NOT EDIT THIS FILE ...

jince
2016/03/09
60
0
NDK开发笔记—ndk环境安装及其搭建

ndk环境安装及其搭建 软件下载 链接:pan.baidu.com/s/1cev9FK 密码:7yab 当然其他版本的也可以,建议不要用最新的 注意:执行Javah的时候生成头文件是对Java文件所生成的.class进行处理的命...

codeGoogle
2017/09/26
0
0
无名Android逆向数据分析

第1课 恋恋DES加密初探+smali注入调试 第2课 stl逆向+jni动态加载识别+YOYO卡sha1实战 第3课 4399游戏盒DES-CBC算法+自定义salt分析 第4课 IDEA动态调试搭建与HTTPS抓包 第5课 搜狐AES+MD5+S...

13269051240
2018/05/21
0
0
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 ......

断桥残雪断桥残雪
2015/08/31
61
0
NDK开发中这些基本知识你都懂吗

JNIEnv 定义: 相当于一个jni上下文对象。 作用: 通过JNIEnv的指针能够对Java端的代码进行操作: a.创建Java对象. jstring str = (env).NewStringUTF("终端研发部"); jclass jclazz = (env)...

codeGoogle
2017/09/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
10
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部