C代碼回調(diào)java方法
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供安寧網(wǎng)站建設(shè)、安寧做網(wǎng)站、安寧網(wǎng)站設(shè)計、安寧網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、安寧企業(yè)網(wǎng)站模板建站服務(wù),10余年安寧做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
① 找到字節(jié)碼對象
//jclass (FindClass)(JNIEnv, const char*);
//第二個參數(shù) 要回調(diào)的java方法所在的類的路徑 "com/itheima/callbackjava/JNI"
② 通過字節(jié)碼對象找到方法對象
//jmethodID (GetMethodID)(JNIEnv, jclass, const char, const char);
第二個參數(shù) 字節(jié)碼對象 第三個參數(shù) 要反射調(diào)用的java方法名 第四個參數(shù) 要反射調(diào)用的java方法簽名
javap -s 要獲取方法簽名的類的全類名 項目/bin/classes 運行javap
③ 通過字節(jié)碼創(chuàng)建 java對象(可選) 如果本地方法和要回調(diào)的java方法在同一個類里可以直接用 jni傳過來的java對象 調(diào)用創(chuàng)建的Method
jobject obj =(*env)-AllocObject(env,claz);
當(dāng)回調(diào)的方法跟本地方法不在一個類里 需要通過剛創(chuàng)建的字節(jié)碼對象手動創(chuàng)建一個java對象
再通過這個對象來回調(diào)java的方法
需要注意的是 如果創(chuàng)建的是一個activity對象 回調(diào)的方法還包含上下文 這個方法行不通!!!回報空指針異常
④ 反射調(diào)用java方法
//void (CallVoidMethod)(JNIEnv, jobject, jmethodID, ...);
第二個參數(shù) 調(diào)用java方法的對象 第三個參數(shù) 要調(diào)用的jmethodID對象 可選的參數(shù) 調(diào)用方法時接收的參數(shù)
package dis;
import java.io.*;
import java.math.*;
public class dis
{
public static void main(String [] s) throws Exception
{
Float a,b,c;
double x2;
double x1;
System.out.println("請輸入a, b, c的值");
BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));
a=Float.parseFloat(bReader.readLine());
b=Float.parseFloat(bReader.readLine());
c=Float.parseFloat(bReader.readLine());
if (b*b - 4*a*c = 0)
System.out.println("輸入的系數(shù)不對,b2-4ac不大于0!程序退出!");
else
{
x1 = (-b + Math.sqrt(b*b - 4*a*c))/2*a;
x2 = (-b - Math.sqrt(b*b - 4*a*c))/2*a;
System.out.println("x1 = "+ x1);
System.out.println("x2 = "+x2);
}
return;
}
}
不難么?!我認(rèn)為C語言應(yīng)該事先不了反射的,即使所謂的實現(xiàn)也不是真正的動態(tài)。
Java反射有很多場景:1、最簡單的是通過字符串(類名)在運行時加載一個類然后產(chǎn)生調(diào)用;2、更復(fù)雜的包括從類里面獲取方法、field信息,然后產(chǎn)生強制調(diào)用。
這些東西依賴的核心是class文件結(jié)構(gòu),以1為例,java文件編譯好了之后他的包路徑和其類全名完全一致,所以很容易通過字符串搜索一個類,而C語言編譯好了之后都是obj文件,這個二進制文件中不存在什么名字信息,所有的東西都變成二進制碼了;第一個還好說,第二種情況則更不可能,Java要想動態(tài)獲取類中的方法,其前提是class文件中這些方法、field的定義信息都還在,如果不在的話你如何獲???如何調(diào)用。以調(diào)用為例,假設(shè)你想調(diào)用add方法,可人家編譯好的obj文件中不存在add方法的原始聲明?。語言中要求調(diào)用其他文件中的東東還必須在我這幾這邊手工寫好外部聲明的原因與此類似。
總之,我覺得不太可能實現(xiàn)反射。要想實現(xiàn)反射,必須保證其編譯后的文件中,源碼信息不丟失,否則反不過來。換句話說,具有反射能力的語言比如是依賴虛擬機運行的。注,這里面的虛擬機不僅僅是jre的,.net的framework本質(zhì)上也是虛擬機。
個人理解.