JNI详解+示例

来源:互联网 发布:java 替换jar包中的类 编辑:程序博客网 时间:2024/06/05 18:57

java 调用C方法 (无参数无返回值非静态)

头文件生成方式就不多说了(javah)

java端

public native void test();

C端

JNIEXPORT void JNICALL Java_com_xyes_music_jni_None_test  (JNIEnv *, jobject){    cout << "test message from c++" << endl;}

运行结果

------------无参数无返回值---------------test message from c++

java调用C方法(有参数无返回值非静态)

java端

public native void test(int num, String name);

C端

JNIEXPORT void JNICALL Java_com_xyes_music_jni_WithParam_test  (JNIEnv * env, jobject obj, jint number, jstring str){    jboolean is_copy = (jboolean) 12;     const char* _str = env->GetStringUTFChars(str,&is_copy);    cout << "c++ receive message:str=" << _str << endl;    cout << "number=" << number << endl;}

运行结果

-------------有参数无返回值--------------c++ receive message:str=message from javanumber=123

java调用C方法(有参数有返回值非静态)

java端

//返回基本类型public native int test(String str);//返回对象public native String testString();

C端

//实现带参数待返回值JNIEXPORT jint JNICALL Java_com_xyes_music_jni_WithReturn_test  (JNIEnv *env, jobject obj, jstring str){    jboolean is_copy = (jboolean) 12;    const char* param = env->GetStringUTFChars(str,&is_copy);    cout << "param=" << param << endl;    jint return_value = 123456;    cout << "return value=" << return_value << endl;    return return_value;} JNIEXPORT jstring JNICALL Java_com_xyes_music_jni_WithReturn_testString  (JNIEnv *env, jobject){    const char* chars = "return from c++";    return env->NewStringUTF(chars);}

静态方法JNI

java端

public static native void test();

C端

JNIEXPORT void JNICALL Java_com_xyes_music_jni_StaticMethod_test  (JNIEnv *, jclass){    cout << "static method test success" << endl;   }

C访问java属性

java端

private int value;public native void test();

C端

JNIEXPORT void JNICALL Java_com_xyes_music_jni_OperatField_test  (JNIEnv *env, jobject obj){    jfieldID fid;    jclass clazz = env->GetObjectClass(obj);    fid = env->GetFieldID(clazz,"value","I");    jint value = env->GetIntField(obj,fid);    cout << "value=" << value << endl;    value = 942698;    env->SetIntField(obj,fid,value);    cout << "set value to " << value << endl;}

运行结果

-------------操作对象中属性--------------value=123set value to 942698final value = 942698

C调用java方法

java端

    public String method(int value) {        StringBuffer buffer = new StringBuffer();        for (int i = 0; i < value; i++) buffer.append("hello");        String result = buffer.toString();        return result;    }    public native void test();

C端

JNIEXPORT void JNICALL Java_com_xyes_music_jni_InvokeMethod_test  (JNIEnv *env, jobject obj){    jclass clazz = env->GetObjectClass(obj);    jmethodID method_id = env->GetMethodID(clazz,"method","(I)Ljava/lang/String;"); //方法签名通过使用javap -s 类全名获得(注意后面有分号)    if(NULL == method_id){        cout << "方法不存在" << endl;        return;    }    jstring return_value = (jstring) env->CallObjectMethod(obj,method_id,10);    jboolean is_copy = 1;    cout << "return value = " << env->GetStringUTFChars(return_value,&is_copy) << endl;}

运行结果

-------------C++调用java方法--------------return value = hellohellohellohellohellohellohellohellohellohello
原创粉丝点击