简单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
分享到:
相关推荐
一个简单的Android JNI程序通常包含以下部分: 1. Java源文件:定义Java类和本地方法(native方法)。 2. C/C++源文件:实现本地方法的逻辑。 3. Android.mk或CMakeLists.txt:构建脚本,用于指示Android NDK如何...
在Android平台上,为了确保应用程序的数据安全,开发人员经常需要实现本地加解密功能。本项目主要探讨了如何使用C++语言通过JNI(Java Native Interface)与Android应用交互,实现基于OpenSSL库的加解密算法,包括...
本DEMO将向你展示如何在Java程序中使用JNI来与本地代码(如C或C++)进行交互。 首先,理解JNI的基本概念至关重要。JNI提供了一种方式,让Java虚拟机(JVM)能够调用本地方法(非Java语言编写的方法),同时也允许...
本教程将带你了解如何创建并运行你的第一个JNI程序,这是一个基本的Android JNI应用实例。 首先,我们需要理解JNI的工作原理。JNI提供了一种方式,让Java代码能够调用本地(native)代码,也就是C/C++代码。这通常...
本文将详细介绍如何构建一个简单的JNI程序,实现Java调用C++代码。 #### 二、步骤详解:从Java到C++ 1. **编写包含本地方法的Java类** 首先,创建一个名为`NativeHello.java`的Java类,其中定义了一个本地方法`...
这个"简单易懂基于Android的JNI例子程序.rar"压缩包提供了一个基础的示例,帮助初学者理解如何在Android应用中使用JNI来调用本地(C/C++)代码。以下是关于JNI在Android开发中的相关知识点的详细解释: 1. **JNI...
在这个"通过JNI实现C++与JAVA相互调用之TCP编程"的示例中,我们探讨的是如何使用JNI来实现TCP通信,其中C++作为底层通信引擎,而Java则负责上层应用逻辑。 首先,TCP(Transmission Control Protocol)是一种面向...
Android上的JNI实现主要涉及到Android应用开发中的本地化编程技术,JNI(Java Native Interface)是Java平台提供的一种标准接口,允许Java代码和其他语言写的代码进行交互。这个案例是为初学者设计的,旨在帮助理解...
在Android应用程序中,我们可以使用JNI来调用这个驱动,实现读写操作或者其他特定功能。 总结起来,使用JNI调用驱动程序能够帮助Android开发者充分利用硬件资源,提高应用的执行效率。然而,这也带来了调试难度增加...
创建一个简单的JNI程序涉及以下步骤: 1. **定义Java接口**:首先,你需要在Java代码中定义一个包含native关键字的方法,这个方法将被本地代码实现。 ```java public class HelloWorld { public native void ...
本示例是关于如何在Eclipse开发环境中结合Microsoft Visual Studio 2010来实现JNI程序开发的一个详细教程。 首先,我们需要理解JNI的核心概念。JNI允许Java应用程序调用本地(非Java)代码,比如C++,并反之亦然。...
cocos2d-x 通过JNI实现c/c++和Android的java层函数互调, 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数。 (2)通过c++函数调用Android的java层函数,显示一...
三、实现一个非常简单的JNI实例程序 以下是一个简单的JNI程序示例: ```java // JNITest.java public class JNITest { static { System.loadLibrary("native-lib"); } public native String stringFromJNI();...
通过运行这个实例,我们可以学习到如何设置JNI环境,如何在Java中声明本地方法,如何在C/C++中实现这些方法,以及如何在Java程序中调用本地方法。这个过程对于理解和掌握JNI非常重要,因为它是Java与C/C++等其他语言...
Android平台上的JNI(Java Native Interface)程序是用来连接Java和C/C++代码的桥梁,它允许开发者在Android应用中使用本地库或实现特定性能敏感的代码。在这个“Android-一个简单的JNI程序”中,我们将深入探讨如何...
这个简单的“Hello world”程序展示了JNI的基本流程,但实际应用中,JNI可能涉及更复杂的操作,如处理Java对象、异常处理、多线程等。了解并熟练运用JNI,开发者可以充分利用Java的跨平台特性,同时利用C/C++的高效...
而采用第三方API,如文中提到的demo程序,可以提供完整的解决方案,通过简单的Java调用接口,就能快速实现音视频通信功能。 在具体实现步骤中: 1. **初始化SDK**:这是开始使用的首要步骤,通过设置回调函数来...
这个"一个简单的JNI实验"是一个实践教程,旨在帮助初学者理解如何在Java程序中调用本地(非Java)代码,比如C或C++。下面我们将详细探讨JNI的相关知识点。 1. **JNI的基本概念**: JNI是Java平台提供的一种机制,...