![](/img/trans.png)
[英]Access violation calling a native (C++) function from Java using JNI: Is this an issue with my code, or a known issue?
[英]Access native code from my own language
我正在學習構建一種可以編譯為字節碼的 OOP 語言,然后使用在 C++ 中實現的基於堆棧的 vm 來解釋它。 我的問題是如何用我自己的語言調用本機函數(在我的例子中是 C++ 函數)。
例如,我有一個 C++ 文件:native.cpp
float div2(int x) {
return float(x) / 2;
}
和 func 用我的語言調用:
import native
void main() {
int foo = 1234;
print(native.div2(foo));
}
如果我創建一條新指令,我必須重新構建整個解釋器。
對不起,我的英語不好。
假設問題是關於如何將函數調用添加到您的 OOP 語言,而不必在每次添加另一個本機函數時向解釋器編寫一堆特定於用例的支持代碼……一種方法是編寫具有按名稱注冊的本機函數的通用函數調用接口。 例如,您的 C++ 文件可能包含一個 std::map,它(在初始化時)填充了 OOP 語言允許調用的各種函數的名稱,例如:
std::map<std::string, std::function> userAccessibleFunctions;
int main(int argc, char ** argv)
{
userAccessibleFunctions["div2"] = div2;
[... add other functions here...]
// the rest of your program's startup-and-run code here
}
...那么當你的 OOP 語言需要調用一個原生函數時,它可以在 userAccessibleFunctions 表中通過它的名稱查找該函數,如果存在,它可以調用它。 (請注意,我沒有在此處包含有關如何處理不同參數類型和返回類型的信息,因為我還沒有充分使用 std::function 來自信地談論它)
我建議您查看 libffi ( https://sourceware.org/libffi/ ) 以及如上所述的函數注冊方案。 注冊處理調用內容,而 libffi 部分處理調用方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.