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