首先建立Test.java,然后使用javac Test.java编译的到Test.class,然后再使用javah -jni Test得到Test.h,然后建立Test.c并且include “Test.h"并实现相应的本地方法。这些步骤做好之后使用如下命令将Test.c编译成动态链接库:
gcc -c Test.c
gcc -shared -fPCI -o libtest.so Test.o
注意:需要先将jni.h和jni_md.h拷贝到当前目录中,并且将jni.h中的改成"jni_md.h",将Test.h中的改为"jni_md.h"。
相关源代码如下:
/***********Test.java***************/
public class Test{
static{
System.loadLibrary("test");
}
public Test(){
System.out.println(getString());
String str="Hello,BBBBBBBBBBBBBBA";
showString(str);
}
public native String getString();
public native void showString(String str);
public static void main(String[] args){
new Test();
}
}
/***************Test.h****************/
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class Test */
#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Test
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Test_getString
(JNIEnv *, jobject);
/*
* Class: Test
* Method: showString
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_Test_showString
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
/************Test.c***************/
#include "Test.h"
#include
#include
#include
jstring CStr2Jstring( JNIEnv* env, const char* pat )
{
//定义java String类 strClass
jclass strClass = (*env)->FindClass(env,"Ljava/lang/String;");
//获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
jmethodID ctorID = (*env)->GetMethodID(env,strClass, "", "([BLjava/lang/String;)V");
//建立byte数组
jbyteArray bytes = (*env)->NewByteArray(env,(jsize)strlen(pat));
//将char* 转换为byte数组
(*env)->SetByteArrayRegion(env,bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
//设置String, 保存语言类型,用于byte数组转换至String时的参数
jstring encoding = (*env)->NewStringUTF(env,"GB2312");
//将byte数组转换为java String,并输出
return (jstring)(*env)->NewObject(env,strClass, ctorID, bytes, encoding);
}
char* Jstring2CStr(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env,"java/lang/String");
jstring strencode = (*env)->NewStringUTF(env,"GB2312");
jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode);
jsize alen = (*env)->GetArrayLength(env,barr);
jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1); //new char[alen+1];
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
(*env)->ReleaseByteArrayElements(env,barr,ba,0);
return rtn;
}
JNIEXPORT jstring JNICALL Java_Test_getString (JNIEnv *env, jobject obj){
char *mychar="Hello,AAAAAAAAAAAAAAAAAB";
return CStr2Jstring(env,mychar);
}
JNIEXPORT void JNICALL Java_Test_showString (JNIEnv *env, jobject obj, jstring str){
char *mychar=Jstring2CStr(env,str);
printf("-->%s
}
程序编译运行环境:
root@ubuntu:/home/kyc# javac -version
javac 1.6.0_27
root@ubuntu:/home/kyc# java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.3) (6b27-1.12.3-0ubuntu1~12.04)
OpenJDK Server VM (build 20.0-b12, mixed mode)
程序运行截图:
(--------------完----------------)