起因
java里有native关键字。JVM在实现的时候,还有我们需要的时候,会用到natvie和JNI,以便在java中调用c/c++代码。我的参考原文http://www.cnblogs.com/bastard/archive/2012/05/17/2506877.html 。
过程
我的环境是opensuse12.3 64位系统,jdk1.6.0。下面是过程。
首先写一个JNITester类中调用一个本地方法print,和一个含有主函数的类(其实可以写到一起)。
public class JNITester
{
public native void print(String content);
static
{
System.loadLibrary("JNITester");
}
}
public class HelloJNI
{
public static void main(String[] args) {
new JNITester().print("Hello,JNI.\n");
}
}
然后javac JNITeser.java得到JNITester.class,javah JNITester得到JNITester.h,参照JNITester.h写JNITester.c,加上输出字符的代码。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNITester */
#ifndef _Included_JNITester
#define _Included_JNITester
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNITester
* Method: print
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_JNITester_print
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
#include<jni.h>
#include<stdio.h>
#include"JNITester.h"
JNIEXPORT void JNICALL Java_JNITester_print
(JNIEnv *env, jobject obj, jstring content)
{
const jbyte *str = (const jbyte *)(*env)->GetStringUTFChars(env,content,JNI_FALSE);
printf("e~%s\n",str);
(*env)->ReleaseStringUTFChars(env,content,(const char *)str);
return;
}
然后利用 gcc -m32 -shared -fPIC -o libJNITester.so JNITester.c 生成so文件,这里我用了-m32参数,因为我遇到wrong ELF class: ELFCLASS64的错误,所以就生成32位代码。最后java HelloJNI(当然要先javac)就可以了。