JNI

在JNI (.c) 端,若要使用.Andoird (.java) 的物件,都是要先從JNI端建立java object,如[程式碼一]

程式碼一: 建立java object

Java_【className】_【methodName】( JNIEnv* jniEnv, jobject thiz, jstring javaString) \
{
   //經由java class 去建立 java object
   jclass javaClass = jniEnv->FindClass("【packagepath/classname】");
   jmethodID construction_id = jniEnv->GetMethodID(javaClass,"<init>", "()V");
   jobject javaObject = jniEnv->NewObject(javaClass,construction_id);
}

建立出java object完畢之後,再來就是使用java object內的方法(method)以及參數(value)。

java method部分,可使用JNI JNIEnv 的 GetMethodID,先確立該Java object method 是否存在以及正確,如[程式碼二]及[程式碼三]。

程式碼二: 取得 Java object

Java_className_methodName( JNIEnv* jniEnv, jobject thiz, jstring javaString) \
{
   // 利用 java class 判斷方法是存在,若存在的話再使用java object去呼叫
   // 此範例是去判斷 javaClass 是否有 setWidth 的函示存在
   methodId = jniEnv->GetMethodID(javaClass, "setWidth", "(J)V");
   if (methodId)
        jniEnv->CallVoidMethod(javaObject , methodId, jlong(5));

   methodId = jniEnv->GetMethodID(javaClass, "GetEnvelope", "()【packagename/methodname;】");
   if (methodId)
   {

   }
}

程式碼三:.Java Class

public class RasterClass
{
    private long _Width;
    protected IEnvelope _Envelope;

    @Override
    public void setWidth(long value)
    {
    _Width = value;
    }

    public long getWidth()
    {
    return _Width;
    }

    public IEnvelope GetEnvelope()
    {
    return _Envelope;
    }
}

code在確認方法是否存在的過程中,最大的問題通常是【要如何下達正確的參數,如"(J)V"】 雖然說在JNI的文件內有描述參數該如何下達,但通常最大的問題不是在於int, double..等等地判斷,而是較為複雜的使用方式,關於此部分會再另外開一篇文章 Android - JNI 之間物件傳遞參數撰寫方式

results matching ""

    No results matching ""