java是属于比较上层的语言,在大多数情况下,它都可以给开发带来方便和高效率;但是在一些特定的情况下,它可能就没有低级语言那么好用了,所以就需要有能够调用其他低级语言来实现其不擅长的功能.
JAVA通过JNI来调用C语言的实现,其基本思想是,由java定义接口,由c实现并生成dll文件,再由java通过之前定义的接口调用具体的实现.
主要步骤有:
- 编写.java文件,其中c中的函数要用public native static修饰;
- 编译.java文件为.class文件,使用javah生成.h文件;
- 按照.h文件中的函数形式在c中实现函数;
- 生成.dll文件,拷贝到java工程中.
详细解释:
第一步骤不多说.
第二步骤:其命令如,javah -classpath . -jni HelloWorld --->将当前文件夹中的HelloWorld.class编译成HelloWorld.h;
第三步骤:将h文件加入到c项目中,并实现.这个也不细述.若不太明白可以参见JNI中另外的一篇文章
第四步骤:就是将上一步生成的dell文件放在java项目的根路径.
现在就可以测试下了.测试类中在static块中使用System.loadLibrary("hello"); 来加载hello.dell文件.
加载成功后就可以像调用普通的java类一样调用了.
接下来给出一个实例:
java代码(为简单起见,不加入任何包):
- public class HelloWorld {
- public native void displayHelloWorld(String msg);
- public native String formatInput(String input);
- static {
- System.loadLibrary("hello");
- }
- public static void main(String[] args) {
- HelloWorld helloWorld = new HelloWorld();
- helloWorld.displayHelloWorld("中文");
- System.out.println(helloWorld.formatInput("中文您好!"));
- }
- }
- /* 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: displayHelloWorld
- * Signature: (Ljava/lang/String;)V
- */
- JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
- (JNIEnv *, jobject, jstring);
- /*
- * Class: HelloWorld
- * Method: formatInput
- * Signature: (Ljava/lang/String;)Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_HelloWorld_formatInput
- (JNIEnv *, jobject, jstring);
- #ifdef __cplusplus
- }
- #endif
- #endif
相关推荐
通过jni完成java调用c/c++,包含c/c++生成Dll动态库
Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用 http://blog.csdn.net/u014702653/article/details/71141423
cocos2d-x 通过JNI实现c/c++和Android的java层函数互调, 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数。 (2)通过c++函数调用Android的java层函数,显示一...
java 调用 dll 的方法,即JNI的使用,demo中有get()/set()方法,操作步骤详细,即使是没用过java的程序员按照步骤依然可以成功。
利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。...详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的...
完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接。...
JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...
NULL 博文链接:https://wuneng94zui.iteye.com/blog/1218725
JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的...
完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...
V. Eclipse+CDT+MinGW 进行JAVA调用C/C++ 34 一、 安装eclipse3.2。 34 二、 安装MinGW。 34 1、 下载MinGW 34 2、 安装 34 3、 安装版本 34 4、 选择安装的编译器 34 5、 选择安装路径,下一步 35 6、 等待下载...
NULL 博文链接:https://conkeyn.iteye.com/blog/1597188
C/C++中访问Java方法 C/C++中访问Java父类的方法 C/C++中访问/修改Java变量 Java中访问C/C++方法 Java中访问/修改C/C++变量 动态方式实现: C/C++中访问Java方法 C/C++中访问Java父类的方法 C/C++中访问/修改Java...
JAVA通过JNI调用C++代码函数的示例DEMO
如果你想知道怎样用java去本地调用C/C++接口,本文档应该是你需要的,特别对于无基础的朋友,无疑是很好的JNI入门指南,希望对你有帮助。
Java通过JNI调用C++接口,Demo文档描述(里面有代码),里面有Windows下调用版和linux下调用版,经本人亲自测试,可用。
Android Studio3.0开发JNI流程,C++调用Java以及Java调用C++,C++/Java互相调用一个简单案例
本教程主要讲解java中如何调用C/C++,C/C++中如何调用java,并带Demo和调试指南