jni 基础入门

来源:互联网 发布:unity3d 流媒体播放 编辑:程序博客网 时间:2024/06/06 20:49

之前编写jni都是在Android中,这次突然想用原生态的Java调用c++。原来也是用jni的交叉编译的。

首先安装jdk,然后在jdk中会有jni的头文件 jdk->include文件中。

打开vs2005.新建一个DLL。

然后在属性中添加包含文件,选择jni.h所在路径。

然后编译的话,会出现问题,无法打开包括文件:jni_md.h: No such file or directory

这是因为在系统目录下也没有jni_md.h这个头文件中,可以将JAVAHOME/include/win32下找到拷贝到项目目录下。

如果出现无法打开包括文件:jni.h: No such file or directory。那么就是还没有导入jni.h所在的路径。



接着就是编写代码

在DLL的头文件中。

#include <jni.h>
#include "jni_md.h"      //在当前文件夹下

#ifndef  _Included_MyDll
#define  _Included_MyDll
#ifdef __cplusplus
extern "C"{
#endif
    JNIEXPORT int JNICALL Java_test1_get(JNIEnv*, jclass, jstring);   // JNIEXPORT 返回类型 JNICALL JAVA_Java类所在文件夹_Java类型_方法(JNIENV *, jclass,参数...)  原型是这样的。
    JNIEXPORT void JNICALL Java_test1_set(JNIEnv*, jclass, jint);
    JNIEXPORT jstring JNICALL Java_test1_getString(JNIEnv*, jclass, jstring);
#ifdef  __cplusplus
};
#endif
#endif

在DLL的cpp文件中

static int i;

JNIEXPORT int JNICALL Java_test1_get(JNIEnv* env, jclass obj, jstring s)
{
    char * st = (char *) (env)->GetStringUTFChars(s, 0);       
    printf("%s--%d", st, i);
    return i;
}

JNIEXPORT void JNICALL Java_test1_set(JNIEnv* env, jclass obj, jint j)
{
    i = j;
}
JNIEXPORT jstring JNICALL Java_test1_getString(JNIEnv*env, jclass obj, jstring s)
{
    char * st = (char *) (env)->GetStringUTFChars(s, 0);    

    char * str=st;
    jstring rtn;   
    rtn = (env)->NewStringUTF(str);   
    return rtn;    
}


接着就是在eclipse中的Java代码

在eclipse中直接新建一个Java project。然后新建一个class。

然后在设置导入的库

ps:出现 no XXX in Java.library.path的问题,则导入库后就可以解决(http://blog.openlg.net/index.php/archives/723)


在属性中选择Java Build Path->Libraries->Native library localtion,选择Edit。然后添加DLL所在的路径。

然后在剩下的就是Java代码了

public class test1 {
    
    static{
        System.loadLibrary("testDLL");   //导入库名
    }
    
    public native static int get(String s);       //定义本地方法:public  native static 返回类型 方法名(参数)
    public native static String getString(String s);
    public native static void set(int i);
    
    public static void main(String[] args) {
        test1 t = new test1();
        t.set(7);
        System.out.println(t.get("test id"));
        System.out.println(t.getString("aaaaaa"));
    }
}

最后的结果如下:

ps:其中类型之间的转换

http://dolphin-ygj.iteye.com/blog/519492

0 0
原创粉丝点击