最近学习cocos2dx,的lua绑定机制,用到了Jni,但是如今目前的3.0版本的Demo工程文件太大,看起来不太方便,因而决定本身先尝试学习一下jni的实现远离,从最简单的java显示helloworld程序开始。java
首先用eclipse建立java应用,加入包com.testJni和testJni.java文件python
package com.testJni; public class testJni{ static{ System.loadLibrary("testJni"); } private native void display(); public static void main (String[] args){ new testJni().display(); } }
这里display方法的native关键字表示了这是一个使用jni实现的函数,来自于testJni这个外部库,编译一下在bin目录下生成了class文件,而后咱们要利用javah生成c语言的头文件,这一步也是卡了我好久的一步,首先咱们来看一看javah这个命令eclipse
它有两个关键参数 -jni和-classpath,classpath指定了加载类的路径,可是无论我怎么设置,一直会提示我找不到类,后来我百度了不少文章,发现javah这条命令执行位置必须是源码目录,即src目录下,我将class文件拷贝到目录下仍是不行,屡次尝试以后我发现-jni的路径必须是包名+类名的路径(java文件的路径),即javah执行路径是src目录,-classpath指定class的路径,-jni执行java文件路径,对应个人工程文件命令是函数
javah -classpath D:\workspace\testJni\bin -jni com.testJni.testJni
这样就顺利生成了.h文件学习
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_testJni_testJni */ #ifndef _Included_com_testJni_testJni #define _Included_com_testJni_testJni #ifdef __cplusplus extern "C" { #endif /* * Class: com_testJni_testJni * Method: display * Signature: ()V */ JNIEXPORT void JNICALL Java_com_testJni_testJni_display (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
以后咱们编写c文件实现Java_com_testJni_testJni_display这个方法ui
#include <jni.h> #include <stdio.h> #include "testJni.h" JNIEXPORT void JNICALL Java_com_testJni_testJni_display(JNIEnv *env, jobject obj) { printf("testJni load dll is here!\n"); printf("hello world!\n"); return; }
利用vs编译生成dll连接库,须要注意的是须要导入jni相关的jni.h(JAVA_HOME/include),和jni_md.h(JAVA_HOME/include/win32),这JAVA_HOME指的是你的jdk路径,还有由于个人电脑安装的是64位操做系统,在project编译属性中要选择machine64而不是machine86,将生成的dll文件放在java工程目录下,设置java build path 的Native library location为dll所在路径,而后运行lua