`
yeshaoting
  • 浏览: 686273 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

简单JNI实现程序

    博客分类:
  • J2SE
阅读更多

 

简单JNI实现程序



图来自百度百科 词条: JNI

内容相关知识来源于网络 

 

1. 编写Java类代码(JNITest.java)

 

// A simple JNI program.
// author: jarg
// http://jarg.iteye.com/

public class JNITest
{
	private native int max(int[] elements);	// declare the function: max.
	public static void main(String[] args)
	{
		int[] elements = {2,3,11,5,8,1,5,24,11,32};
		System.loadLibrary("Maxdll");	// load the function in dll.

		// output the max one in array elements.
		System.out.println("The max one of elements: " + new JNITest().max(elements));
	}
}

 

 该Java程序用来测试,调用本地函数即动态链接库(Maxdll.dll)中的函数.

private native int max(int[] elements);声明本地函数.

System.loadLibrary("Maxdll");用于加载动态链接库

new JNITest().max(elements);向本地函数传入一个整型数组,执行本地函数max求数组中最大值的操作.

 

 

2. 编译成字节代码(JNITest.class)

编译JNITest.java,生成相应的.class文件.

 

 

3. 产生C头文件(JNITest.h)

命令中输入javah JNITest生成JNITest.h的头文件.

JNITest.h

 

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

#ifndef _Included_JNITest
#define _Included_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JNITest
 * Method:    max
 * Signature: ([I)I
 */
JNIEXPORT jint JNICALL Java_JNITest_max
  (JNIEnv *, jobject, jintArray);

#ifdef __cplusplus
}
#endif
#endif

 

 头文件jni.h位于:jdk安装目录\include.

另外,jni.h包含的jni_md.h位于:jdk安装目录\include\win32.

 

函数max(int elements)以 JNIEXPORT jint JNICALL Java_JNITest_max(JNIEnv *, jobject, jintArray);的形式在JNITest.h头文件中被声明,然后在JNITest.cpp程序被实现.

JNIEXPORT 说明该函数是一个被外部程序调用的函数.

jint对应于Java语言中int型,C语言中的long(因为java中int型是32位,等长于C中long型)做为返回函数类型.

 

JNICALL(__stdcall)是函数调用约定的一种,表示

  1.参数从右向左压入堆栈

  2.函数被调用者修改堆栈

  3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸

函数名Java_JNITest_max: 外部调用语言为Java,类名为JNITest,函数名为max.

命名规则是: Java_类名_方法名.

特别的,当类在一个类包(例如,com.jarg)中时,点号用下划线代替,即为Java_com_jarg_JNITest_max.

函数参数: JNIEnv *, jobject, jintArray 其中,JNIEnv是在jni.h中定义的JNI环境,jintArray是传入参数elements对应的类型.(jobject不太清楚)

 

 

4. 编写JNI实现代码(Maxdll.cpp)

VC++ 6.0 新建->工程->Win32 Dynamic-Link Library 工程命名为Maxdll

添加一个Maxdll.cpp文件到工程.

 

// the implement of max.
// author: jarg
// http://jarg.iteye.com/

#include "JNITest.h"
#include "stdio.h"

JNIEXPORT jint JNICALL Java_JNITest_max(JNIEnv *env, jobject obj, jintArray elements)
{
	int max;
	jint *result = env->GetIntArrayElements(elements,false);
	if (result == NULL)
	{
		return 0;
	}
	for (int i=0; i<env->GetArrayLength(elements); i++)
	{
		if(i == 0)
			max = result[0];
		if(result[i] > max)
			max = result[i];
	}
	return max;

 

 

5. 编译成链接库文件(Maxdll.dll)

 

这是max函数对应的实现,经编译,连接后在工作空间\Debug中生成Maxdll.dll.

将其拷贝到.class文件目录下.

 

6. 运行Java程序(JNITest.java)

运行Java程序(java JNITest),得到调用本地函数max后的结果:

The max one of elements: 32

 

这类知识网上很多.

推荐链接: http://hi.baidu.com/leona_leon/blog/item/79f0090c71e022386059f388.html

http://hi.baidu.com/madrigar/blog/item/2635622755cfa504918f9d29.html

http://hi.baidu.com/madrigar/blog/item/10175d60936b0cd88db10d95.html

http://hi.baidu.com/madrigar/blog/item/cc7f242d89ef7a33349bf797.html

http://hi.baidu.com/madrigar/blog/item/4502b999895d160f6e068cee.html

 

  • 大小: 55.6 KB
0
1
分享到:
评论

相关推荐

    最简单的Android JNI程序

    一个简单的Android JNI程序通常包含以下部分: 1. Java源文件:定义Java类和本地方法(native方法)。 2. C/C++源文件:实现本地方法的逻辑。 3. Android.mk或CMakeLists.txt:构建脚本,用于指示Android NDK如何...

    androidjni实现本地加解密数据,使用C++语言编写,基于openssl实现 集成RSAAES3DESBASE64MD5

    在Android平台上,为了确保应用程序的数据安全,开发人员经常需要实现本地加解密功能。本项目主要探讨了如何使用C++语言通过JNI(Java Native Interface)与Android应用交互,实现基于OpenSSL库的加解密算法,包括...

    JNI实现示例DEMO

    本DEMO将向你展示如何在Java程序中使用JNI来与本地代码(如C或C++)进行交互。 首先,理解JNI的基本概念至关重要。JNI提供了一种方式,让Java虚拟机(JVM)能够调用本地方法(非Java语言编写的方法),同时也允许...

    第一个JNI程序

    本教程将带你了解如何创建并运行你的第一个JNI程序,这是一个基本的Android JNI应用实例。 首先,我们需要理解JNI的工作原理。JNI提供了一种方式,让Java代码能够调用本地(native)代码,也就是C/C++代码。这通常...

    JNI攻略之一――建立一个简单的JNI程序

    本文将详细介绍如何构建一个简单的JNI程序,实现Java调用C++代码。 #### 二、步骤详解:从Java到C++ 1. **编写包含本地方法的Java类** 首先,创建一个名为`NativeHello.java`的Java类,其中定义了一个本地方法`...

    简单易懂基于Android的JNI例子程序.rar

    这个"简单易懂基于Android的JNI例子程序.rar"压缩包提供了一个基础的示例,帮助初学者理解如何在Android应用中使用JNI来调用本地(C/C++)代码。以下是关于JNI在Android开发中的相关知识点的详细解释: 1. **JNI...

    通过JNI实现C++与JAVA相互调用之TCP编程

    在这个"通过JNI实现C++与JAVA相互调用之TCP编程"的示例中,我们探讨的是如何使用JNI来实现TCP通信,其中C++作为底层通信引擎,而Java则负责上层应用逻辑。 首先,TCP(Transmission Control Protocol)是一种面向...

    android上jni实现

    Android上的JNI实现主要涉及到Android应用开发中的本地化编程技术,JNI(Java Native Interface)是Java平台提供的一种标准接口,允许Java代码和其他语言写的代码进行交互。这个案例是为初学者设计的,旨在帮助理解...

    Android应用程序使用JNI调用驱动程序

    在Android应用程序中,我们可以使用JNI来调用这个驱动,实现读写操作或者其他特定功能。 总结起来,使用JNI调用驱动程序能够帮助Android开发者充分利用硬件资源,提高应用的执行效率。然而,这也带来了调试难度增加...

    深入浅出JNI.第一讲 (JNI概述、编写首个JNI程序)

    创建一个简单的JNI程序涉及以下步骤: 1. **定义Java接口**:首先,你需要在Java代码中定义一个包含native关键字的方法,这个方法将被本地代码实现。 ```java public class HelloWorld { public native void ...

    jni程序开发简单示例和说明(eclipse + Microsoft Visual Studio 2010).zip

    本示例是关于如何在Eclipse开发环境中结合Microsoft Visual Studio 2010来实现JNI程序开发的一个详细教程。 首先,我们需要理解JNI的核心概念。JNI允许Java应用程序调用本地(非Java)代码,比如C++,并反之亦然。...

    ocos2d-x 通过JNI实现c/c++和Android的java层函数互调

    cocos2d-x 通过JNI实现c/c++和Android的java层函数互调, 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数。 (2)通过c++函数调用Android的java层函数,显示一...

    Android-JNI实现方式及实例演示_有米分享.doc

    三、实现一个非常简单的JNI实例程序 以下是一个简单的JNI程序示例: ```java // JNITest.java public class JNITest { static { System.loadLibrary("native-lib"); } public native String stringFromJNI();...

    java jni简单实例

    通过运行这个实例,我们可以学习到如何设置JNI环境,如何在Java中声明本地方法,如何在C/C++中实现这些方法,以及如何在Java程序中调用本地方法。这个过程对于理解和掌握JNI非常重要,因为它是Java与C/C++等其他语言...

    Android-一个简单的JNI程序

    Android平台上的JNI(Java Native Interface)程序是用来连接Java和C/C++代码的桥梁,它允许开发者在Android应用中使用本地库或实现特定性能敏感的代码。在这个“Android-一个简单的JNI程序”中,我们将深入探讨如何...

    用JNI写的Hello world程序

    这个简单的“Hello world”程序展示了JNI的基本流程,但实际应用中,JNI可能涉及更复杂的操作,如处理Java对象、异常处理、多线程等。了解并熟练运用JNI,开发者可以充分利用Java的跨平台特性,同时利用C/C++的高效...

    Android平台下通过JNI快速实现音视频通信

    而采用第三方API,如文中提到的demo程序,可以提供完整的解决方案,通过简单的Java调用接口,就能快速实现音视频通信功能。 在具体实现步骤中: 1. **初始化SDK**:这是开始使用的首要步骤,通过设置回调函数来...

    一个简单的JNI实验

    这个"一个简单的JNI实验"是一个实践教程,旨在帮助初学者理解如何在Java程序中调用本地(非Java)代码,比如C或C++。下面我们将详细探讨JNI的相关知识点。 1. **JNI的基本概念**: JNI是Java平台提供的一种机制,...

Global site tag (gtag.js) - Google Analytics