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


浙公网安备 33010602011771号