在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程序,就大功告成了。