JNI详解+示例

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 java
number=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=123
set value to 942698
final 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值