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
阅读全文
0 0
- android JNI 示例详解
- JNI详解+示例
- android JNI的使用示例详解
- AndroidStudio实现JNI的示例详解
- AndroidStudio实现JNI的示例详解
- NDK环境搭建和JNI示例详解
- JNI示例
- JNI示例
- JNI示例
- JNI初步 -- Hello JNI示例
- JNI简单示例
- JNI简单示例
- JNI使用小示例
- JNI示例及讲解
- JNI代码示例
- JNI示例 - 2
- JNI示例 - 3
- JNI简单示例
- 《Visual C++ 2010入门经典》(第五版)-第五章 程序结构1 5.3函数中的静态变量
- Python中的装饰器(decorator)
- Summary of D-SLATS
- Webix label字太多需要自动换行的问题
- vue 短信验证码UI
- JNI详解+示例
- 浅析重定向与反弹Shell命令
- 160
- java代码输出5遍同样的字符串,java编译,运行命令
- 提问:什么才是学习设计的正确姿势
- MIPS汇编 最大子序列和
- Python sorted() 函数
- 自己记载
- Celery-4.1 用户指南: Periodic Tasks