`
VerRan
  • 浏览: 458669 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

java 之 JNI

    博客分类:
  • JAVA
 
阅读更多

前言:

在查看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之JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当需要利用已有的C/C++库,或者需要提升性能时,因为Java的某些操作可能...

    Android C、Java、JNI效率测试结果.doc

    Android C、Java、JNI效率测试结果分析 Android 操作系统中,效率测试是一个非常重要的方面,特别是在使用 JNI(Java Native Interface)调用 C 语言时。这个文档描述了 Android G1 环境中,C、Java、JNI 调用(C ...

    JAVA通过JNI调用C#dll的整个项目工程

    Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...

    Java再说JNI之实例

    Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。JNI在Java世界中扮演着重要角色,它允许Java程序调用C/C++等本地代码,反之亦然,使得Java应用可以利用底层...

    Java通过JNI调用DLL动态库

    Java通过JNI调用DLL动态库,亲测试编写

    JAVA项目JNI调用dll实现DEMO源码,C++&JAVA

    完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...

    java的JNI本地方法介绍大全

    Java的JNI(Java Native Interface)本地方法是一种技术,允许Java代码与用其他编程语言(如C和C++)编写的本地代码进行交互。自从Java 1.1开始,JNI已经成为Java平台的一个重要组成部分,它的主要目标是保持平台的可...

    java高级jni教程

    Java高级JNI教程主要探讨了Java Native Interface(JNI)这一技术,它是Java平台中用于与本地代码交互的重要工具。JNI允许Java程序调用C/C++编写的库,反之亦然,从而实现了Java应用与操作系统底层功能的深度融合。...

    Java通过JNI调用C语言函数库的方法.zip

    Java通过JNI(Java Native Interface)调用C语言函数库是一种常见的技术实践,它允许Java程序直接与本地操作系统和硬件交互,提高性能或者利用已有的C/C++代码库。本资料"Java通过JNI调用C语言函数库的方法.zip"提供...

    GMSSL的java调用(JNI库和调用实例).zip

    在这个“GMSSL的java调用(JNI库和调用实例).zip”压缩包中,我们主要探讨如何在Java环境中通过JNI(Java Native Interface)来调用GMSSL库,以便利用这些国密算法进行数据加解密和哈希运算。 首先,我们需要了解...

    Java_JNI_获得系统进程信息实例.doc

    ### Java与JNI结合获取系统进程信息的实现 #### 概述 在《Java_JNI_获得系统进程信息实例.doc》中,我们探索了一个利用Java Native Interface (JNI)来获取操作系统进程信息的示例项目。该项目由三个主要部分组成:`...

    JAVA使用JNI读写INI文件

    JAVA使用JNI读写INI文件的实例。 JAVA本身并没有读写INI文件的现成方法,有些人自己编写方法来读写INI文件,但是这样的方法或多或少的存在着一些问题。此示例旨在利用本地的WIN32API函数来读写INI文件,这样可以保证...

    java jni简单实例

    Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如调用系统库、优化性能关键的代码或者利用已有的C/C++库。本资源提供的“java ...

    java_jni_my.rar_java j_java jni_jni

    Java JNI(Java Native Interface)是Java平台中一个重要的特性,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用已有的C/C++库,优化性能敏感的部分,或者利用硬件特性等。这个...

    Java采用JNI调用VC++生成的dll(Java与C++交互)

    在Java编程中,有时我们需要调用已有的C++代码或者利用C++的高性能特性,这时Java本地接口(JNI,Java Native Interface)就派上了用场。JNI是Java平台的一部分,它的主要作用是提供了一种机制,使得Java代码能够与...

    java 的jni本地调用简单实例

    Java的JNI(Java Native Interface)本地调用是一个关键的技术,它允许Java代码直接调用C/C++编写的原生库,极大地扩展了Java应用程序的功能。在这个简单实例中,我们将探讨如何实现这一过程,同时注意到由于Java和...

    APK加固(JAVA/JNI二种方式动态加载dex)

    http://blog.csdn.net/csdn49532/article/details/50624627 配套代码,使用JAVA和JNI二种方法动态加载dex,调用dex中的方法,对android APK进行加固,防止APK被破解。

    Java JNI调用IC卡读卡器

    Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多情况下被用来调用本地库,比如C、C++编写的库,这在处理特定硬件设备或者高性能计算时非常有用。在...

    Java通过JNI调用C++的DLL文件.docx

    Java 通过 JNI 调用 C++ 的 DLL 文件 JNI(Java Native Interface)是一种允许 Java 代码和本地应用程序交互的技术。通过 JNI,Java 应用程序可以调用本地库,反之亦然。本文将详细介绍如何使用 JNI 将 Java 应用...

Global site tag (gtag.js) - Google Analytics