首先建立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>改成"jni_md.h",将Test.h中的<jni_md.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 __cplusplusextern "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 <string.h>#include <stdio.h>#include <stdlib.h>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, "<init>", "([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<--\n",mychar);}
程序编译运行环境:
root@ubuntu:/home/kyc# javac -versionjavac 1.6.0_27root@ubuntu:/home/kyc# java -versionjava 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)
程序运行截图:
(————–完—————-)
勇士面前无险路。