接上一篇(JNI学习笔记(三)JNI中本地语言访问Java类中的属性与方法)

      下面学习JNI中本地语言创建Java对象并且访问具体方法

   

      我们来查看jni.h头文件会发现其中有个如下方法:

  •  jobject NewObject(jclass clazz, jmethodID methodID, ...) {
            va_list args;
            jobject result;
            va_start(args, methodID);
            result = functions->NewObjectV(this,clazz,methodID,args);
            va_end(args);
            return result;
        }
       这样我们可以通过本地代码来创建Java对象,下面我们来直接举个例子来演示一下(这个例子是使用本地代码来创建Java对象,并且使用本地代码来访问该Java对象中的方法)

(一):Java端的代码如下:
package com.jiangqq.jni;  /**  * 使用本地代码创建Java对象  * @author jiangqq  *  */ public class TestJni { 	public static native void outputMyTest(); 	 	public static void main(String[] args) { 	   System.loadLibrary("nativeCode5"); 	   outputMyTest(); 	} } 

package com.jiangqq.util;  /**  * 新建MyTest类,在本地方法中进行初始化,并且调用类中的方法  * @author jiangqq  *  */ public class MyTest {    public MyTest()    { 	       }    /**     * 使用本地语言调用,并且返回一个长×××的数     * @return temp     */    public double printf(double temp)    { 	   	   return temp;    } } 

(二):本地代码的步骤
  1. 使用FindClass()来获取要创建的对象的jclass;
  2. 使用GetMethodID()获取构造函数;
  3. 使用NewObject()来创建对象
  4. 下面就要开始调用对象中的方法了,当然首先也要使用GetMethodID()获取方法
  5. 调用访问,使用Call<Type>Method()
    看本地代码的例子的写法:
    
#include"com_jiangqq_jni_TestJni.h" #include<stdio.h> #include<iostream> using namespace std; JNIEXPORT void JNICALL Java_com_jiangqq_jni_TestJni_outputMyTest 	(JNIEnv * env, jclass jclazz) {  	//////////使用本地代码来创建Java对象,并且调用该对象中的具体方法/////////////// 	jclass clazz_myTest=env->FindClass("com/jiangqq/util/MyTest"); 	jmethodID jmethod_myTest=env->GetMethodID(clazz_myTest,"<init>","()V"); 	jobject jobject_myTest=env->NewObject(clazz_myTest,jmethod_myTest); 	 	jmethodID jmethod_printf=env->GetMethodID(clazz_myTest,"printf","(D)D"); 	jdouble j_temp=env->CallDoubleMethod(jobject_myTest,jmethod_printf,1234.0); 	printf("%.f\n",j_temp); 	 }