日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JNI基础 c语言调用java方法

發布時間:2024/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JNI基础 c语言调用java方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用c語言調用java無參的方法

java方法

 com.example.jniparsedata.ParseData類中的方法
?? ?//打印
?? ?public void sayHelloFromJava(){
?? ??? ?System.out.println("sayHelloFromJava");
?? ?}
?? ?
?? ?//c調用java中帶兩個參數的方法
?? ?public int javaAdd(int x,int y){
?? ??? ?return x + y;
?? ?}
?? ?//c調用java中參數為String的方法
?? ?public void printString(String s){
?? ??? ?System.out.println("java打印的字符串" + s);
?? ?}
?? ?//c語言中調用java靜態方法
?? ?public static void smethod(){
?? ??? ?System.out.println("我是java中的靜態方法");
?? ?}

?

其他類com.example.jniparsedata.OtherClass中的方法

    public void methodFromOtherClass(){
?? ??? ?    System.out.println("我是其他類中的方法 ");
??   ?}

1,在java類中聲明需要調用的c語言方法

  //在java中同樣需要聲明
?? ?//c語言中調用java中無參方法
?? ?public native void callMethod1();
?? ?//c語言中調用java中int參數方法
?? ?public native void callMethod2();
?? ?//c語言中調用java中參數為String的方法
?? ?public native void callMethod3();
?? ?//c語言調用java中靜態方法
?? ?public native void callMethod4();
?? ?//c語言調用java中其他類的方法
?? ?public native void callMethod5();

2, 去項目的src目錄下執行命令

    javah 類名

  將src目錄下新生成的.h 文件拷貝到項目的jni目錄下

3? 引入Android.mk文件,建立.c文件,將.h文件中的方法copy到.c文件中,添加參數

4? c代碼中的方法實現

 //c語言回調java方法
//這里是利用反射技術調用java方法
JNIEXPORT void JNICALL Java_com_example_jniparsedata_ParseData_callMethod1
(JNIEnv * env, jobject jobject) {
?? ?//1 利用反射拿到java類
?? ?jclass clazz = (*env)->FindClass(env,"com/example/jniparsedata/ParseData");//注意這里的.要換成/因為實在linux系統下
?? ?//2 需要得到方法的簽名 ,到項目的bin/classes目錄下使用命令javap -s 類名
?? ?//反射找到方法
?? ?jmethodID jmethodid = (*env)->GetMethodID(env,clazz,"sayHelloFromJava","()V");
?? ?//3調用
?? ?(*env)->CallVoidMethod(env,jobject,jmethodid);
}

JNIEXPORT void JNICALL Java_com_example_jniparsedata_ParseData_callMethod2
(JNIEnv *env, jobject jobject) {
?? ?//1 利用反射拿到java類
?? ?jclass clazz = (*env)->FindClass(env,"com/example/jniparsedata/ParseData");//注意這里的.要換成/因為實在linux系統下
?? ?//2 需要得到方法的簽名 ,到項目的bin/classes目錄下使用命令javap -s 類名
?? ?//反射找到方法
?? ?jmethodID jmethodid = (*env)->GetMethodID(env,clazz,"javaAdd","(II)I");
?? ?//3調用
?? ?int result = (*env)->CallIntMethod(env,jobject,jmethodid,3,5);
?? ?LOGI("x+y=%d", result);
}

JNIEXPORT void JNICALL Java_com_example_jniparsedata_ParseData_callMethod3
(JNIEnv *env, jobject jobject) {
?? ?jclass clazz = (*env)->FindClass(env,"com/example/jniparsedata/ParseData"); //注意這里的.要換成/因為實在linux系統下
?? ?//2 需要得到方法的簽名 ,到項目的bin/classes目錄下使用命令javap -s 類名
?? ?//反射找到方法
?? ?jmethodID jmethodid = (*env)->GetMethodID(env,clazz,"printString","(Ljava/lang/String;)V");
?? ?//生成java字符串
?? ?jstring str = (*env)->NewStringUTF(env,"c callback java");
?? ?//4調用
?? ?(*env)->CallVoidMethod(env,jobject,jmethodid,str);
}

JNIEXPORT void JNICALL Java_com_example_jniparsedata_ParseData_callMethod4
? (JNIEnv * env, jobject obj){
?? ?//c語言調用java中靜態方法
?? ?//1獲得java類的字節碼
?? ?jclass clazz = (*env)->FindClass(env,"com/example/jniparsedata/ParseData");//注意這里的.要換成/因為實在linux系統下
?? ?//2,獲得方法的ID
?? ?jmethodID methodId = (*env)->GetStaticMethodID(env,clazz,"smethod","()V");
?? ?//3,調用靜態方法
?? ?(*env)->CallStaticVoidMethod(env,clazz,methodId);
}


JNIEXPORT void JNICALL Java_com_example_jniparsedata_ParseData_callMethod5
? (JNIEnv * env, jobject obj){
?? ?//c語言中調用java中其他類中的方法
?? ?// 1,拿到類的字節碼
?? ?jclass clazz? = (*env)->FindClass(env,"com/example/jniparsedata/OtherClass");//注意這里的.要換成/因為實在linux系統下
?? ?//2,獲得類的方法
?? ?jmethodID methodId = (*env)->GetMethodID(env,clazz,"methodFromOtherClass","()V");
?? ?//3,獲得該方法類的對象
?? ?jobject object = (*env)->AllocObject(env,clazz);//注意這個jobject對象的名字和傳進來的jobject對象的名字不能重名
?? ?//調用方法
?? ?(*env)->CallVoidMethod(env,object,methodId);
}

轉載于:https://www.cnblogs.com/bxf123/p/5025830.html

總結

以上是生活随笔為你收集整理的JNI基础 c语言调用java方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。