Java中JNI的使用詳解第八篇:重載的實(shí)現(xiàn)

第一步: 編寫java

public class HelloWorld{

    static {
        System.loadLibrary("native");
    }
    public native void callJavaFun(String str);
    public native void callJavaFun(String str,String param);

    public static void main(String[] args) {
        HelloWorld world=new HelloWorld();
        world.callJavaFun("say");
        world.callJavaFun("say","I am param");
    }

    public void say(){
        System.out.println("I AM CLASS");
    }

    public void say(String str){
        System.out.println(str);
    }
}

第二步: 編譯、獲取,更改JNI頭文件名

$ javac HelloWorld.java
$ javah HelloWorld
$ mv HelloWorld.h  HelloWorld.c

第三步完成JNI文件的編寫

#include <jni.h>
JNIEXPORT void JNICALL Java_HelloWorld_callJavaFun__Ljava_lang_String_2
  (JNIEnv * env, jobject pramjob, jstring jstr){

const char *str;
    //
    str=(*env)->GetStringUTFChars(env,jstr,NULL);
    if (str==NULL)
    {
        return ;
    }

    //
    jmethodID mid  = NULL;

    jclass cls = (*env)->GetObjectClass(env,pramjob);

    mid = (*env)->GetMethodID(env,cls,str,"()V");

    (*env)->CallVoidMethod(env,pramjob,mid);

  }

JNIEXPORT void JNICALL Java_HelloWorld_callJavaFun__Ljava_lang_String_2Ljava_lang_String_2
  (JNIEnv * env, jobject pramjob, jstring jstr, jstring jstr2){

    const char *str;
    //
    str=(*env)->GetStringUTFChars(env,jstr,NULL);
    if (str==NULL)
    {
        return ;
    }

    const char *str2;
    //
    str2=(*env)->GetStringUTFChars(env,jstr2,NULL);
    if (str==NULL)
    {
        return ;
    }
    //
    jmethodID mid  = NULL;

    jclass cls = (*env)->GetObjectClass(env,pramjob);

    mid = (*env)->GetMethodID(env,cls,str,"(Ljava/lang/String;)V");

    (*env)->CallVoidMethod(env,pramjob,mid,jstr2);
  }

第四步: 編譯、設(shè)置程序共享庫位置

$ gcc HelloWorld.c -shared -fPIC -o libnative.so -I /usr/lib/jvm/java-7-openjdk-amd64/include/
$ export LD_LIBRARY_PATH=.

第五步: 執(zhí)行、打印成功!

I AM CLASS
I am param

Jni提供的更多調(diào)用方法:
   jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
    jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
    jboolean    (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);
    jboolean    (*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    jboolean    (*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
    jbyte       (*CallByteMethod)(JNIEnv*, jobject, jmethodID, ...);
    jbyte       (*CallByteMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    jbyte       (*CallByteMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
    jchar       (*CallCharMethod)(JNIEnv*, jobject, jmethodID, ...);
    jchar       (*CallCharMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    jchar       (*CallCharMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
    jshort      (*CallShortMethod)(JNIEnv*, jobject, jmethodID, ...);
    jshort      (*CallShortMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    jshort      (*CallShortMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
    jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
    jint        (*CallIntMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    jint        (*CallIntMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
    jlong       (*CallLongMethod)(JNIEnv*, jobject, jmethodID, ...);
    jlong       (*CallLongMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    jlong       (*CallLongMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
    jfloat      (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...) __NDK_FPABI__;
    jfloat      (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list) __NDK_FPABI__;
    jfloat      (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*) __NDK_FPABI__;
    jdouble     (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...) __NDK_FPABI__;
    jdouble     (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list) __NDK_FPABI__;
    jdouble     (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*) __NDK_FPABI__;
    void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
    void        (*CallVoidMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    void        (*CallVoidMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容