Java调用C++: JNI的使用入门

关于JNI的概念、原理,请谷歌之,这里介绍JNI的使用入门程序。

一、Java端

1.编写Java类Sample。

public class Sample {
    //四种native方法,用于测试int、boolean、String和int[]
    public native int intMethod(int n);
    public native boolean booleanMethod(boolean bool);
    public native String stringMethod(String text);
    public native int intArrayMethod(int[] intArray);
 
    public static void main(String[] args) {
       //加载Dll
       System.loadLibrary("MyDLL");
       Sample sample = new Sample();
       int square = sample.intMethod(5);
       boolean bool = sample.booleanMethod(true);
       String text = sample.stringMethod("JAVA");
       int sum = sample.intArrayMethod(new int[] { 1, 1, 2, 3, 5, 8, 13 });
       System.out.println("intMethod: " + square);
       System.out.println("booleanMethod: " + bool);
       System.out.println("stringMethod: " + text);
       System.out.println("intArrayMethod: " + sum);
    }
}
2. 编译Sample类,生成Sample.class。

javac Sample.java
3.编译Sample类,生成用于C++的.h头文件Sample.h。

javah -jni Sample
Sample.h内容如下:

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

#ifndef _Included_Sample
#define _Included_Sample
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Sample
 * Method:    intMethod
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_Sample_intMethod
  (JNIEnv *, jobject, jint);

/*
 * Class:     Sample
 * Method:    booleanMethod
 * Signature: (Z)Z
 */
JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod
  (JNIEnv *, jobject, jboolean);

/*
 * Class:     Sample
 * Method:    stringMethod
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Sample_stringMethod
  (JNIEnv *, jobject, jstring);

/*
 * Class:     Sample
 * Method:    intArrayMethod
 * Signature: ([I)I
 */
JNIEXPORT jint JNICALL Java_Sample_intArrayMethod
  (JNIEnv *, jobject, jintArray);

#ifdef __cplusplus
}
#endif
#endif
二、C++端

1.在VS(笔者使用的是VS2010)新建Win32项目,名称为MyDLL(以便生成的dll文件名为MyDLL.dll),下一步选择工程为DLL,确定。

2.新建头文件Sample.h,内容为之前生成的Sample.h中的内容;或者可以导入之前生成的Sample.h。

3.新建cpp文件Sample.cpp,用于实现Sample.h文件中定义的函数。Sample.cpp内容如下:

#include "stdafx.h"

/*
 * Class:     Sample
 * Method:    intMethod
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_Sample_intMethod(JNIEnv *env, jobject obj, jint num)
{
	return num*num;
}

/*
 * Class:     Sample
 * Method:    booleanMethod
 * Signature: (Z)Z
 */
JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod(JNIEnv *env, jobject obj, jboolean boolean)
{
	return !boolean;
}

/*
 * Class:     Sample
 * Method:    stringMethod
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Sample_stringMethod(JNIEnv *env, jobject obj, jstring str)
{
	const char* s = env->GetStringUTFChars(str,0);
	char cap[128];
	strcpy(cap,s);
	env->ReleaseStringUTFChars(str,s);
	return env->NewStringUTF(strupr(cap));
}

/*
 * Class:     Sample
 * Method:    intArrayMethod
 * Signature: ([I)I
 */
JNIEXPORT jint JNICALL Java_Sample_intArrayMethod(JNIEnv *env, jobject obj, jintArray array)
{
	int i,sum = 0;
	jsize len = env->GetArrayLength(array);
	jint *body = env->GetIntArrayElements(array,0);
	for(i=0;i<len;i++)
	{
		sum += body[i];
	}
	env->ReleaseIntArrayElements(array,body,0);
	return sum;
}
3.在stdAfx.h中添加#include “Sample.h”引用。编译生成MyDLL.dll文件。

三、调用

在命令行中执行java程序,该程序调用C++本地代码实现。

java Sample
执行结果如图所示:









  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值