JAVA可以通过JNI接口访问本地的动态连接库,从而扩展JAVA的功能。使用JAVA JNI接口主要包括以下步骤:
(1)编写JAVA代码,注明要访问的本地动态连接库和本地方法;
(2)编译JAVA代码得到.class文件;
(3)使用javah -jni 生成该类对应的C语言.h文件;
(4)使用C/C++实现(3)生成的.h文件中声明的各函数;
(5)编译C/C++实现代码生成动态连接库。
本文使用一个简单的helloWorld示例演示JNI的使用。
(1)编写JAVA代码
public class helloWorld
{
public native void SayHello(String name);
static
{
System.loadLibrary("examdll");
}
public static void main(String [] argv)
{
helloWorld hello = new helloWorld();
hello.SayHello("myName");
}
}
(2)编译JAVA代码
javac helloWorld.java
(3)生成实现函数头文件
javah -classpath . helloWorld
得到的文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class helloWorld */
#ifndef _Included_helloWorld
#define _Included_helloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: helloWorld
* Method: SayHello
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_helloWorld_SayHello
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
(4)在VC中实现上述函数
#include "helloWorld.h"
#include <stdio.h>
#include <string.h>
void JNICALL Java_helloWorld_SayHello(JNIEnv * env, jobject obj, jstring str)
{
jboolean b = true;
char s[80];
memset(s, 0, sizeof(s));
strcpy_s(s ,(char*)env->GetStringUTFChars(str, &b));
printf("Hello, %s", s);
env->ReleaseStringUTFChars(str , NULL);
}
这是JNI的关键:通过env我们可以使用JAVA提供的一组函数操作与转换函数传递的参数。
(5)编译VC项目得到动态连接库 examdll.dll。
分享到:
相关推荐
总的来说,"jni-helloWorld"是一个非常适合初学者了解JNI基本用法的实例,通过它,开发者可以学习到如何在Java程序中嵌入本地代码,实现Java与本地代码的高效交互。而提供的错误处理和解决方案则有助于在实践中解决...
JNIEXPORT void JNICALL Java_HelloWorld_sayHello(JNIEnv *env, jobject thisObj) { printf("Hello, World from C++!\n"); } ``` `JNIEXPORT`和`JNICALL`是JNI定义的宏,用于指定导出函数的返回类型和调用约定...
JNIEXPORT void JNICALL Java_HelloWorld_sayHello(JNIEnv *env, jobject obj) { printf("Hello from C++!\n"); } ``` 这里,`JNIEXPORT`和` JNICALL`是JNI约定的宏,用于正确导出和导入函数。`JNIEnv*`是一个指向...
在这个"第一个JNI实例学习"中,我们将探讨如何创建并运行一个基本的JNI程序。 首先,我们需要理解JNI的核心概念。JNI提供了一套接口,让Java代码能够声明本地方法,这些方法在运行时由本地(非Java)代码实现。本地...
#### HelloWorld示例 一个经典的入门示例是通过JNI实现的“Hello World”。这通常涉及在C或C++中编写本地方法,然后在Java中调用该方法来打印消息。此示例展示了如何声明本地方法,如何在本地代码中实现它,以及...
1. **HelloWorld.java** - 这是我们的Java源代码,它包含了JNI函数的声明和Java方法调用。 2. **HelloWorld.h** - JNI头文件,由Java编译器生成,包含了C/C++的函数原型。 3. **HelloWorld.cpp** - C/C++源代码,...
`Java_HelloWorld_sayHello`是Java方法名的JNI格式,`JNIEnv *env`和`jobject thisObj`是JNI接口指针和对象实例。 2. **构建本地库**: 使用C编译器(如gcc)编译`HelloWorld.c`生成动态链接库(如在Linux上为`.so...
2. **生成头文件**:使用`javac HelloWorld.java`和`javah -jni HelloWorld`生成`HelloWorld.h`。 3. **实现C/C++代码**:编写`HelloWorld.cpp`,并实现`setMsg`和`getMsg`方法。这两个方法需要与Java的类型对应,...
总结来说,JNI实例通常包含以下步骤: 1. 在Java类中声明native方法。 2. 使用`System.loadLibrary()`加载本地库。 3. 创建C++源文件,实现对应的native方法。 4. 编译C++代码为本地库。 5. 运行Java程序,调用JNI...
如果你是在Java环境中测试,可以创建一个Java主程序,实例化`HelloWorld`类并调用`printMessage()`。如果在C++中运行,可能需要通过JNI的`AttachCurrentThread`等函数手动管理Java虚拟机(JVM)的生命周期。 总的来...
public class HelloWorld { public static void sayHello() { System.out.println("Hello from Java!"); } } ``` 在C/C++代码中,可以通过以下方式调用这个方法: ```c #include <jni.h> int main() { JavaVM...
生成的`HelloWorld.h`文件包含了JNI接口的定义。 - **用C/C++实现头文件:** ```c #include <jni.h> #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_sayHello(JNIEnv *env, jobject obj) ...
首先,我们需要编写一个简单的Java类`HelloWorld.java`。这个类中包含了一个本地方法`myPrint()`,这个方法将在C/C++代码中实现。 ```java public class HelloWorld { static { System.loadLibrary("HelloWorld")...
通过这个简单的JNI HelloWorld示例,你可以了解到Java与本地代码交互的基本步骤。实际开发中,JNI可以用来实现性能敏感的部分,访问操作系统API,或者整合其他已有的C/C++库。理解并熟练掌握JNI,对Java开发者来说是...
在"JNI HelloWorld"这个主题中,我们主要讨论的是如何通过JNI技术在Java程序中调用C语言编写的函数,实现Java与本地代码的无缝集成。 1. **JNI简介** JNI是一种接口,为Java虚拟机(JVM)提供了与本地代码(如C/...
本教程将深入探讨如何使用JNI和NDK(Native Development Kit)来创建一个简单的“Hello, World!”程序。 首先,我们需要理解NDK是什么。NDK是Google提供的一套工具,用于在Android平台上编译和运行C/C++代码。它...
接下来,在项目的`jni`目录下创建一个名为`HelloWorld_jni.cpp`的C++文件,这里我们将实现Java层声明的native方法。在Android Studio中,这个目录默认位于`app/src/main/jni`。 在`HelloWorld_jni.cpp`中,我们需要...
总结来说,Android JNI实例主要涉及以下几个关键点: 1. 在Java层声明native方法。 2. 使用`javah`或Android Studio生成头文件。 3. 编写C/C++代码实现头文件中的方法。 4. 配置CMake或NDK构建系统生成.so库文件。 5...
在提供的压缩包`myJni`中,很可能包含了一个简单的JNI实例,比如一个简单的"Hello, World!"程序,或者是演示如何从Java调用C++函数的例子。通过学习这个实例,初学者可以更好地理解如何在Android应用中集成本地代码...