JNI(java native interface)本地接口
只有你理解了jni,你就可以用java调用c/c++ ,也可以c++调用java.一切都是可行的,只不过你是否愿意去做。
下面我来说下使用jni的主要步骤。可能我说的不是很清楚但是没关系,请加我QQ我有很多相关的资料包括视频 QQ565824237
看一下代码
public class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("jnitest"); // jnitest 为动态链接的名称
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
声明
native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。
Load动态库:
System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法 displayHelloWorld()没有实现
同时需要注意的是System.loadLibrary();的参数“jnitest”是动态库的名字。加载的是一个动态的Dll文件
Jni程序开发的一般操作步骤如下:
l. 编写java中的调用类
2 . 用javah生成c/c++原生函数的头文件
3 . c/c++中调用需要的其他函数功能,实现原生函数(原则上可以调用任何资源)
4 . 将项目依赖的所有原生库和资源加入到java项目的java.library.path
5 . 生成java程序
6 . 发布java应用和dll库
1.上面那个helloWorld类已经实现了
2.首先我是在eclipse中编写的,在dos中输入D:\coding\testjni\build\classes的路径
2.1 然后javah com.jh.jni.HelloWorld就会生成一个 com_jh_jni_HelloWorld.h的头文 件
3.然后我们创建一个Windows Dynamic _link library 然后选择空的,将刚才所生成的*.h文件复制到这个工程的目录下面,然后在这个工程右键点击Header File add File导入复制过来的头文件
4.然后输写cpp文件
#include "jni.h"
#include <iostream.h>
#include "com_jh_jni_Hello.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_com_jh_jni_Hello_displayHelloWorld(JNIEnv *env, jclass cls,jstring str)
{
cout<<"hello world可以啦"<<endl;
cout.flush(); //程序运行的结果就是出现“ Hello World! ”。
}
要注意的是jni.h 用“”包含
还有D:\Program Files\Java\jdk1.6.0\include\jni.h
D:\Program Files\Java\jdk1.6.0\include\win32\jni_md.h
复制到这个工程目录下面就可以了
然后Build----Build xxx.dll
然后就会生成一个dll文件在 工程 debug中
后来我遇到了一个问题,一直困扰着我很多天,就是我是用JFrame通过jni来调用dll文件的
就是一直调用不了我还发了一个帖子呢
大家请看http://www.iteye.com/problems/54508 其实就一行代码的问题
生成dll文件以后我们就想着路径问题了
1.在环境变量中的path中输入你dll文件的路径D:\jni专区\jnitest2\Debug
2.可以放在D:\Program Files\Java\jdk1.6.0\bin目录下
3.可以放在C:\WINDOWS\system32目录下
如果你还是不懂的话您请看这个连接 http://www.iteye.com/topic/304594
分享到:
相关推荐
在本文中,我们学习了如何在 VS2008 中调试 JNI 项目。我们了解了 JNI 的基础知识,创建了一个 JNI 项目,并配置了项目设置。我们还添加了 JNI 头文件,编写了 JNI 代码,并生成了 DLL 文件。这些步骤将帮助我们更好...
### Android从HAL、JNI到APP学习心得 #### 一、HAL层详解 HAL(Hardware Abstraction Layer)即硬件抽象层,是Android系统架构中的一个重要组成部分,它为硬件提供了统一的接口,使得上层软件能够独立于硬件进行...
前段时间因为工作需要研究了一下android的串口通信,网上有很多讲串口通信的文章,我在做的时候也参考了很多文章,现在就将我学习过程中的一些心得分享给大家,由于串口开发涉及到jni,所以开发环境需要支持ndk开发...
在学习JAVA基础的过程中,了解并掌握一些常用的英文缩写是非常重要的。这些缩写不仅代表着JAVA技术的核心概念,也是深入理解JAVA平台和应用开发的关键。以下是一些重要术语的详细解释: 1. **API (Application ...
22. **JNI (Java Native Interface)**:JNI允许Java代码与其他编程语言(如C和C++)进行交互,实现本地方法调用。 23. **SableVM**:SableVM是一个用C语言编写的开源Java虚拟机实现。 理解这些术语对于Java开发者...
首先,"一个计算机专业学生几年的编程经验汇总.txt"可能会分享一位学生在学习Java过程中的心得,包括可能遇到的困难、解决方法以及编程技巧。这可能涵盖了一些实践性的建议,如如何有效地学习,如何调试代码,以及...
3. **加载HAL库**:在Java层,通过JNI调用`hw_get_module`函数来获取对应的HAL库,并进一步通过`hw_device_open`函数打开设备,得到设备实例。 ```java // Java层示例 private native void initializeLed(String ...
首先,说明.txt文件可能包含了作者在学习过程中的一些心得、技巧或者案例概述。在逆向工程中,理解代码逻辑、跟踪函数调用、识别加密算法等都是关键技能。作者可能会分享如何使用工具如dex2jar、JD-GUI来将Dalvik...
"BlogForZFB.zip"这个压缩包文件似乎包含了与Android源码学习相关的博客文章或者教程,可能是一个开发者为了分享自己的学习心得或经验整理的资料集。 首先,Android源码的学习涵盖了以下几个主要方面: 1. **...
Evernote标签则暗示这些笔记可能是使用Evernote这款知名笔记软件整理的,方便用户记录、检索和分享学习心得。 JavaSE的学习通常包括以下几个重要知识点: 1. **基础语法**:Java是一门面向对象的语言,其基础语法...
这份名为“Mi_Notes.zip”的压缩包,很可能是某位热心开发者整理的学习笔记,旨在分享他在Android源码学习过程中的心得和体会。这份资源涵盖了多个关键知识点,让我们一起探讨一下。 1. **Android系统架构**:...
学习笔记(WORD)部分通常会包含作者在阅读过程中提炼的关键点、示例代码和实践心得,这对于巩固理论知识和实践经验非常有帮助。开发者可以通过笔记快速回顾重要概念,同时也可以借鉴作者的思考方式来解决问题。 总的...
- **在线资源**:汇总官方文档、博客文章、视频教程等优质学习资源,为读者提供全方位的学习支持。 #### 八、未来展望与发展趋势 - **技术趋势**:探讨未来Android游戏开发领域可能出现的新技术和方向,帮助开发者...
6. **android学习进阶路**: 这可能是为已经有一定基础的开发者准备的进阶教程,涵盖了高级主题,如JNI、自定义视图、多进程、安全性和隐私保护、动画效果等。 7. **10个常见的_Android_新手误区**: 这篇文章可能...
- **JNI基础**:介绍Java Native Interface (JNI)的基本概念和使用方法,这是连接Java代码与C/C++代码的关键技术。 2. **第2章:C/C++与Android** - **数据类型兼容性**:讨论Java与C/C++之间的数据类型差异及其...
2.2 学习JNI的实例:MediaScanner 15 2.3 Java层的MediaScanner分析 16 2.3.1 加载JNI库 16 2.3.2 Java的native函数和总结 17 2.4 JNI层MediaScanner的分析 17 2.4.1 注册JNI函数 18 2.4.2 数据类型转换 22 ...
【Java软件开发实习日记】是记录了一位实习生在青岛进行软件开发实训过程的心得体会,主要涉及了Java和.NET的相关知识。以下是对这些知识点的详细阐述: 1. **角色转变**:实习期间,实习生需要从学生的身份转变为...
它不仅提供了丰富的代码分析,还包含了作者多年来的实战经验和心得,对于希望深入掌握Android系统内部运作机制的开发者来说,是一本不可或缺的参考书。通过学习本书,读者将能够更加自信地面对实际开发中遇到的各种...