前言:
在查看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
相关推荐
world 文档,描述了Android g1环境,C、Java、JNI调用(C调Java、Java调C)基本运算、方法调用、字符串连接的效率测试结果。
Java通过JNI调用DLL动态库,亲测试编写
完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...
一个用java调用本地dll文件的一个qq密码获取器
Java通过JNI调用算法的一些坑
JAVA通过JNI调用C++代码函数的示例DEMO
本资源包括JAVA工程,C++工程,C#dll测试工程
Java通过JNI调用C语言函数库的方法
Java_JNI_获得系统进程信息实例.doc
Java采用JNI调用VC++生成的dll(Java与C++交互)
http://blog.csdn.net/csdn49532/article/details/50624627 配套代码,使用JAVA和JNI二种方法动态加载dex,调用dex中的方法,对android APK进行加固,防止APK被破解。
文档里描述了如何通过jni方法在java与c++代码之间传递非基本类型数据
NULL 博文链接:https://zhaoningbo.iteye.com/blog/1098817
什么是jni本地方法!java里定义的其他语音实现的方法!
java的jni 问题大总结,内有IBM的jni教程和 其他一些jni资料,费了我不少时间哦,希望对大家有帮助!不要错过
JAVA使用JNI读写INI文件的实例。 JAVA本身并没有读写INI文件的现成方法,有些人自己编写方法来读写INI文件,但是这样的方法或多或少的存在着一些问题。此示例旨在利用本地的WIN32API函数来读写INI文件,这样可以保证...
java 的jni本地调用简单实例,本实例不牵扯到java传值给c++进行转换变值等操作,因为java和c++的类型不匹配,需要进行复杂转换。
关于java的JNI跨平台技术的基础介绍了解,能够让你对java的JNI有一定的了解。
本文档在三个方面叙述了java使用JNI调用C++的实例,①java与c++间没有参数传值,②java传入整型,c++返回整型,③java传入两个整型参数,c++返回整型数组。 有需要做以上几方面处理的情下载本文档,简单、清晰、一看...
这个是自己处理扫码枪数据用的,通过JNI实现,把扫码枪设置成串口模式即能被HOOK了.当然键盘也能HOOK,处理比较简单,查下API可以HOOK鼠标等.有C源码,头文件等.动态库用MINGW编译.在WIN7可用,其它平台未试