java本地方法调用(JNI)的参考代码

首先建立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)

程序运行截图:

(————–完—————-)

勇士面前无险路。

java本地方法调用(JNI)的参考代码

相关文章:

你感兴趣的文章:

标签云: