linux下實現java的本地方法調用

來源:互聯網
上載者:User
/*******************MyNative.java**********************/public class MyNative {public void showParms(String s, int i, boolean b) {showParms0(s, i, b);}public int hypotenuse(int a, int b) {return hypotenuse0(a, b);}public void setArray(boolean[] ba) {for (int i = 0; i < ba.length; i++)ba[i] = true;setArray0(ba);}public void showStrings(String[] sa) {showStrings0(sa);}public String[] getStrings() {return getStrings0();}private native void showParms0(String s, int i, boolean b);private native int hypotenuse0(int a, int b);private native void setArray0(boolean[] ba);private native void showStrings0(String[] sa);private native String[] getStrings0();static {System.loadLibrary("MyNative");}public static void main(String[] args) {MyNative obj = new MyNative();obj.showParms("Hello", 23, true);obj.showParms("World", 34, false);System.out.println(obj.hypotenuse(3, 4));System.out.println(obj.hypotenuse(9, 12));boolean[] ba = new boolean[5];obj.setArray(ba);for (int i = 0; i < ba.length; i++)System.out.println(ba[i]);String[] sa = new String[] { "Hello,", "world!", "JNI", "is", "fun." };obj.showStrings(sa);obj.showStrings(obj.getStrings());}}

然後使用如下命令產生MyNative.h檔案

javac MyNative.java

javah -jni MyNative

然後建立MyNative.c檔案,並include  MyNative.h檔案,然後用c實現MyNative.h中定義了的方法,MyNative.h和MyNative.c如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class MyNative */#ifndef _Included_MyNative#define _Included_MyNative#ifdef __cplusplusextern "C" {#endif/* * Class:     MyNative * Method:    getStrings0 * Signature: ()[Ljava/lang/String; */JNIEXPORT jobjectArray JNICALL Java_MyNative_getStrings0  (JNIEnv *, jobject);/* * Class:     MyNative * Method:    showStrings0 * Signature: ([Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_MyNative_showStrings0  (JNIEnv *, jobject, jobjectArray);/* * Class:     MyNative * Method:    showParms0 * Signature: (Ljava/lang/String;IZ)V */JNIEXPORT void JNICALL Java_MyNative_showParms0  (JNIEnv *, jobject, jstring, jint, jboolean);/* * Class:     MyNative * Method:    hypotenuse0 * Signature: (II)I */JNIEXPORT jint JNICALL Java_MyNative_hypotenuse0  (JNIEnv *, jobject, jint, jint);/* * Class:     MyNative * Method:    setArray0 * Signature: ([Z)V */JNIEXPORT void JNICALL Java_MyNative_setArray0  (JNIEnv *, jobject, jbooleanArray);#ifdef __cplusplus}#endif#endif

#include <stdio.h>#include <math.h>#include "MyNative.h"JNIEXPORT void JNICALL Java_MyNative_showParms0  (JNIEnv *env, jobject obj, jstring s, jint i, jboolean b){  const char* szStr = (*env)->GetStringUTFChars( env, s, 0 );  printf( "String = [%s]/n", szStr );  printf( "int = %d/n", i );  printf( "boolean = %s/n", (b==JNI_TRUE ? "true" : "false") );  (*env)->ReleaseStringUTFChars( env, s, szStr );}JNIEXPORT jint JNICALL Java_MyNative_hypotenuse0  (JNIEnv *env, jobject obj, jint a, jint b){  int rtn = (int)sqrt( (double)( (a*a) + (b*b) ) );  return (jint)rtn;}JNIEXPORT void JNICALL Java_MyNative_setArray0  (JNIEnv *env, jclass cls, jbooleanArray ba){  jboolean* pba = (*env)->GetBooleanArrayElements( env, ba, 0 );  jsize len = (*env)->GetArrayLength(env, ba);  int i=0;  // 更改偶數數組元素  for( i=0; i < len; i+=2 )    pba[i] = JNI_FALSE;  (*env)->ReleaseBooleanArrayElements( env, ba, pba, 0 );}JNIEXPORT void JNICALL Java_MyNative_showStrings0  (JNIEnv *env, jclass cls, jobjectArray sa){  int len = (*env)->GetArrayLength( env, sa );  int i=0;  for( i=0; i < len; i++ )  {    jobject obj = (*env)->GetObjectArrayElement(env, sa, i);    jstring str = (jstring)obj;    const char* szStr = (*env)->GetStringUTFChars( env, str, 0 );    printf( "%s ", szStr );    (*env)->ReleaseStringUTFChars( env, str, szStr );  }  printf( "/n" );}JNIEXPORT jobjectArray JNICALL Java_MyNative_getStrings0  (JNIEnv *env, jclass cls){  jstring      str;  jobjectArray args = 0;  jsize        len = 5;  char*        sa[] = { "Hello,", "world!", "JNI", "is", "fun" };  int          i=0;  args = (*env)->NewObjectArray(env, len, (*env)->FindClass(env, "java/lang/String"), 0);  for( i=0; i < len; i++ )  {    str = (*env)->NewStringUTF( env, sa[i] );    (*env)->SetObjectArrayElement(env, args, i, str);  }  return args;}

然後將MyNative.c編譯成動態連結程式庫,makefile檔案如下:

############請注意,這個檔案的檔案名稱一定要為makefile而不要寫成Makefile,不知怎麼回事,寫成Makefile在我自己的電腦上編譯不通過##################libMyNative.so:MyNative.o makefilegcc -Wall -rdynamic -shared -o libMyNative.so MyNative.o MyNative.o:MyNative.c MyNative.hgcc -Wall -c MyNative.c -I./ -I/sandbox/JAVA2S/jdk1.6.0_16/include -I/sandbox/JAVA2S/jdk1.6.0_16/include/linuxcl:rm -rf *.o *.so

注意:上面的“/sandbox/JAVA2S/jdk...../include...."應根據自己的實際情況做修改,這個可以在linux終端使用“find /usr -name jni.h -print"查到。

然後make

然後修改自己的環境變數,增加如下資訊:

export LD_LIBRARY_PATH=./

然後java MyNative運行這個JNI 的java程式,就可以看到輸出了()

(------------------------完-----------------------)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.