前言:
在查看java socket实现代码时最终发现其是通过JNI去调用系统级的soket接口实现soket连接的,因此对JNI做了一点学习。
JNI 就是java本地接口 ,是通过java调用本地系库实现指定功能的方法,下面通过一个最简单的例子做一下记录。
1. 创建java 类:
class HelloWorld{ private native void print(); public static void main (String[] args){ new HelloWorld().print(); } static{ System.loadLibrary("HelloWorld"); } }
2. 编译java 文件
javac HelloWold.java
3. 生成 .h文件
javah -jni HelloWorld
4. 创建 C 文件
#include <jni.h> #include <stdio.h> #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) { printf("java invoke c dll ,it's very cool!\n"); return; }
5 . 生成 dll文件
set include=D:\Program Files\Microsoft Visual Studio 9.0\VC\include set lib=D:\Program Files\Microsoft Visual Studio 9.0\VC\lib cl -Ic:\java\include -Ic:\java\include\win32 -MD -LD HelloWorld.c -FeHelloWorld.dll mt.exe -manifest HelloWorld.dll.manifest -outputresource:HelloWorld.dll;2
6. 执行程序
java HelloWorld
7. 结果
java invoke c dll ,it's very cool!
8. 为了更方便的操作对以上步骤做了一个批处理文件
@echo off echo ----------start compile java file---------- javac HelloWorld.java echo ----------start generate .h file---------- javah -jni HelloWorld echo Please create the c file, Press enter to continue when you complete it . pause echo ----------start generate .dll file---------- set include=D:\Program Files\Microsoft Visual Studio 9.0\VC\include set lib=D:\Program Files\Microsoft Visual Studio 9.0\VC\lib cl -Ic:\java\include -Ic:\java\include\win32 -MD -LD HelloWorld.c -FeHelloWorld.dll mt.exe -manifest HelloWorld.dll.manifest -outputresource:HelloWorld.dll;2 echo ----------end generate dll file---------- echo ----------start execute javaApp ---------- java HelloWorld echo ----------end execute javaApp ---------- pause
后记:
在实际的执行过程中遇到了很多奇怪的问题下面总结如下以便以后使用:
1. 找不到类 C:\Documents and Settings\Administrator\Desktop\学习\技术探路学习\JNI\demo>javah -jni HelloWorld Error: Could not find class file for 'HelloWorld'. 解决方法: javah -jni -classpath . com.example.hellojni.HelloJni 2. 路径格式不对 david@xmomx:src$ javah -jni com/example/hellojni/HelloJni javadoc: error - Illegal package name: "com/example/hellojni/HelloJni" 1 error 解决方法: david@xmomx:src$ javah -jni com.example.hellojni.HelloJni 3. 找不到引入的h文件 cl -Ic:\java\include -IC:\Dev-Cpp\include -Ic:\java\include\win32 -MD -LD HelloWorld.cpp -FeHelloWorld.dll 4. 引入java 的库 -I gcc HelloWorld.c -fPIC -shared -o HelloWorld.so -IC:\java\include -IC:\java\include\win32 5. windows 下编译dll文件 set include=D:\Program Files\Microsoft Visual Studio 9.0\VC\include set lib=D:\Program Files\Microsoft Visual Studio 9.0\VC\lib cl -Ic:\java\include -Ic:\java\include\win32 -MD -LD HelloWorld.c -FeHelloWorld.dll 5.1 LINK : fatal error LNK1104: 无法打开文件“kernel32.lib” 拷贝 kernel32.lib 到 D:\Program Files\Microsoft Visual Studio 9.0\VC\lib 目录下 5.2 JNI调用出现Runtime Error! R6034(引自:http://blog.sina.com.cn/s/blog_70584b480100lj5i.html) mt.exe -manifest HelloWorld.dll.manifest -outputresource:HelloWorld.dll;2
相关推荐
Java之JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当需要利用已有的C/C++库,或者需要提升性能时,因为Java的某些操作可能...
Android C、Java、JNI效率测试结果分析 Android 操作系统中,效率测试是一个非常重要的方面,特别是在使用 JNI(Java Native Interface)调用 C 语言时。这个文档描述了 Android G1 环境中,C、Java、JNI 调用(C ...
Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...
Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。JNI在Java世界中扮演着重要角色,它允许Java程序调用C/C++等本地代码,反之亦然,使得Java应用可以利用底层...
Java通过JNI调用DLL动态库,亲测试编写
完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...
Java的JNI(Java Native Interface)本地方法是一种技术,允许Java代码与用其他编程语言(如C和C++)编写的本地代码进行交互。自从Java 1.1开始,JNI已经成为Java平台的一个重要组成部分,它的主要目标是保持平台的可...
Java高级JNI教程主要探讨了Java Native Interface(JNI)这一技术,它是Java平台中用于与本地代码交互的重要工具。JNI允许Java程序调用C/C++编写的库,反之亦然,从而实现了Java应用与操作系统底层功能的深度融合。...
Java通过JNI(Java Native Interface)调用C语言函数库是一种常见的技术实践,它允许Java程序直接与本地操作系统和硬件交互,提高性能或者利用已有的C/C++代码库。本资料"Java通过JNI调用C语言函数库的方法.zip"提供...
在这个“GMSSL的java调用(JNI库和调用实例).zip”压缩包中,我们主要探讨如何在Java环境中通过JNI(Java Native Interface)来调用GMSSL库,以便利用这些国密算法进行数据加解密和哈希运算。 首先,我们需要了解...
### Java与JNI结合获取系统进程信息的实现 #### 概述 在《Java_JNI_获得系统进程信息实例.doc》中,我们探索了一个利用Java Native Interface (JNI)来获取操作系统进程信息的示例项目。该项目由三个主要部分组成:`...
JAVA使用JNI读写INI文件的实例。 JAVA本身并没有读写INI文件的现成方法,有些人自己编写方法来读写INI文件,但是这样的方法或多或少的存在着一些问题。此示例旨在利用本地的WIN32API函数来读写INI文件,这样可以保证...
Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如调用系统库、优化性能关键的代码或者利用已有的C/C++库。本资源提供的“java ...
Java JNI(Java Native Interface)是Java平台中一个重要的特性,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用已有的C/C++库,优化性能敏感的部分,或者利用硬件特性等。这个...
在Java编程中,有时我们需要调用已有的C++代码或者利用C++的高性能特性,这时Java本地接口(JNI,Java Native Interface)就派上了用场。JNI是Java平台的一部分,它的主要作用是提供了一种机制,使得Java代码能够与...
Java的JNI(Java Native Interface)本地调用是一个关键的技术,它允许Java代码直接调用C/C++编写的原生库,极大地扩展了Java应用程序的功能。在这个简单实例中,我们将探讨如何实现这一过程,同时注意到由于Java和...
http://blog.csdn.net/csdn49532/article/details/50624627 配套代码,使用JAVA和JNI二种方法动态加载dex,调用dex中的方法,对android APK进行加固,防止APK被破解。
Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多情况下被用来调用本地库,比如C、C++编写的库,这在处理特定硬件设备或者高性能计算时非常有用。在...
Java 通过 JNI 调用 C++ 的 DLL 文件 JNI(Java Native Interface)是一种允许 Java 代码和本地应用程序交互的技术。通过 JNI,Java 应用程序可以调用本地库,反之亦然。本文将详细介绍如何使用 JNI 将 Java 应用...