学习JNI的心得

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

你可能感兴趣的:(java,C++,c,jni,C#)