Jni Helloworld

    最近学习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

相关文章
相关标签/搜索