在IntellJ中进行JNI封装(1)

http://blog.csdn.net/xyang81/article/details/41759643感谢这位大大的博客给的指导,下面介绍我自己实践的过程。

在IDE中建立一个工程之后,在主函数里添加下面的一些代码:

package com.example;

public class Main {

    public static native String sayHello(String name);
    public static void main(String[] args) {
        //System.out.println(System.getProperty("java.library.path"));
        String text = sayHello("hello JNI");
        System.out.println(text);
    }
    static{
        System.loadLibrary("HelloWorld");
    }
}

 native声明了一个本地方法,这个函数的具体定义是在c文件中定义,这个后面再说。

然后在main函数里调用了上面声明的本地方法sayHello。然后是一个静态方法,可以在类已创建就会调用,在这个静态方法里加载了外部的库(可以是so库也可以是dll)。

先用javac命令将这个java文件编译成字节码文件class,然后在用javah对这个class文件生成一个头文件.h.

可以在工程里新建一个bin文件夹,用于存放生成的class文件,新建一个jni文件夹,存放生成的头文件。

然后自己写一个C文件,内容如下:

#include "com_example_Main.h"

#ifdef __cplusplus
extern "C
{
#endif
/*
 * Class:     com_example_Main
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_Main_sayHello
  (JNIEnv *env, jclass cls, jstring j_str){
    const char *c_str = NULL;
    char buff[128] = { 0 };
    c_str = (*env)->GetStringUTFChars(env, j_str, NULL);
    if (c_str == NULL)
    {
        printf("out of memory.\n");
        return NULL;
    }
    printf("Java Str:%s\n", c_str);
    sprintf(buff, "hello %s", c_str);
        (*env)->ReleaseStringUTFChars(env, j_str, c_str);
    return (*env)->NewStringUTF(env, buff);
  }

然后可以使用本地的C编译器进行编译,可以用vs的cl编译器,上传一个dll文件,然后将这个dll文件放在系统可以搜索到的库目录下面,再执行这个java程序,就大功告成了。

 

posted @ 2017-12-22 17:09  放学后去打篮球啊  阅读(259)  评论(0编辑  收藏  举报