導航:首頁 > 源碼編譯 > v8編譯不過

v8編譯不過

發布時間:2023-02-07 20:47:21

1. android jni程序(c++)如何編譯適用於arm-v8指令集的32位程序

可以看到Android上層的Application和ApplicationFramework都是使用java編寫,

底層包括系統和使用眾多的LIiraries都是C/C++編寫的。

所以上層Java要調用底層的C/C++函數庫必須通過Java的JNI來實現。

下面將學習Android是如何通過Jni來實現Java對C/C++函數的調用。以HelloWorld程序為例:

第一步:

使用Java編寫HelloWorld 的Android應用程序:

package com.lucyfyr;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("fresne", printJNI("I am HelloWorld Activity"));
}
static
{
//載入庫文件
System.loadLibrary("HelloWorldJni");
}
//聲明原生函數 參數為String類型 返回類型為String
private native String printJNI(String inputStr);
}

這一步我們可以使用eclipse來生成一個App;

因為eclipse會自動為我們編譯此Java文件,後面要是用到。

第二步:

生成共享庫的頭文件:

進入到eclipse生成的Android Project中 :/HelloWorld/bin/classes/com/lucyfyr/
下:

可以看到裡面後很多後綴為.class的文件,就是eclipse為我們自動編譯好了的java文件,其中就有:

HelloWorld.class文件。

退回到classes一級目錄:/HelloWorld/bin/classes/

執行如下命令

javah com.lucyfyr.HelloWorld

生成文件:com_lucyfyr_HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_lucyfyr_HelloWorld */
#ifndef _Included_com_lucyfyr_HelloWorld
#define _Included_com_lucyfyr_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_lucyfyr_HelloWorld
* Method: printJNI
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif

可以看到自動生成對應的函數:Java_com_lucyfyr_HelloWorld_printJNI

Java_ + 包名(com.lucyfyr) + 類名(HelloWorld) + 介面名(printJNI):必須要按此JNI規范來操作;

java虛擬機就可以在com.simon.HelloWorld類調用printJNI介面的時候自動找到這個C實現的Native函數調用。

當然函數名太長,可以在.c文件中通過函數名映射表來實現簡化。

第三步:

實現JNI原生函數源文件:

新建com_lucyfyr_HelloWorld.c文件:

#include <jni.h>
#define LOG_TAG "HelloWorld"
#include <utils/Log.h>
/* Native interface, it will be call in java code */
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI(JNIEnv *env, jobject obj,jstring inputStr)
{
LOGI("fresne Hello World From libhelloworld.so!");
// 從 instring 字元串取得指向字元串 UTF 編碼的指針
const char *str =
(const char *)(*env)->GetStringUTFChars( env,inputStr, JNI_FALSE );
LOGI("fresne--->%s",(const char *)str);
// 通知虛擬機本地代碼不再需要通過 str 訪問 Java 字元串。
(*env)->ReleaseStringUTFChars(env, inputStr, (const char *)str );
return (*env)->NewStringUTF(env, "Hello World! I am Native interface");
}
/* This function will be call when the library first be load.
* You can do some init in the libray. return which version jni it support.
*/
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
void *venv;
LOGI("fresne----->JNI_OnLoad!");
if ((*vm)->GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) {
LOGE("fresne--->ERROR: GetEnv failed");
return -1;
}
return JNI_VERSION_1_4;
}

OnLoadJava_com_lucyfyr_HelloWorld_printJNI

函數裡面做一些log輸出 注意JNI中的log輸出的不同。

JNI_OnLoad函數JNI規范定義的,當共享庫第一次被載入的時候會被回調,

這個函數裡面可以進行一些初始化工作,比如注冊函數映射表,緩存一些變數等,

最後返回當前環境所支持的JNI環境。本例只是簡單的返回當前JNI環境。

http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html

2. c語言程序是對的,編譯不成功是怎麼原因,v8.92

問題描述的不清楚啊,首先你得把你的代碼貼出來,大家才好判斷是不是真的沒有錯。編譯後出的問題,你也沒有說明是什麼問題,至少要把系統給出的出錯信息貼出來。
只是問有問題怎麼處理,說真的,C語言之父來了也是束手無策。

3. 請教各位大神,我用MCC18編譯MPLAB IDE V8.80的C語言時未能編譯成功,單片機型號是16F877。求解!如下:

MCC18 不支持PIC16,你用picc或者xc8或者

4. MPLAB IDE V8.63在編譯時出現錯誤,怎麼解決

對於比較小的程序,一般只有一個c文件和一個頭文件,全局變數我們通常會直接定義在c文件中,在程序之前加inti定義。如果要在頭文件中定義有以下兩種方法:用extern來聲明:externinti;這一句只是對變數i進行聲明,在c文件的程序之前必須加上inti進行定義。externinti=0;這一句聲明和定義都做了。對於大一點的程序,有很多c文件和頭文件,這個時候全局變數就必須在頭文件中聲明(不需要初始化),然後在一個c文件中定義(該初始化的要初始化)。如果在頭文件中定義,則編譯的時候會出現重復定義的錯誤。如果只有頭文件中聲明就會出現沒有定義有警告。***ERRORL104::KMODULE:222.obj(222)出現上述錯誤則是因為變數k重復定義,把你的頭文件中的變數定義前加extern(只是變數聲明不用初始化),再在某一個你要調用該變數的c文件的程序之前再定義(注意第一個調用的c文件要負責附帶初始化該變數,其他調用的c文件就不需要初始化過程啦)一下就可以了。另外:下次最好能把程序貼出來

5. 在ubuntu里怎樣運行編譯好的谷歌v8

大名頂頂的Chrome V8引擎大家應該都知道了,我就不廢話多說,不知道的可以去GOOGLE Code搜索。
不過不得不提的是Google Chrome V8引擎的開發者拉斯巴克(Lars Bak)。他是一個編程天才,卻遠離計算機世界的核心,在丹麥為Google工作,
這個工作地方是一個邊遠的農場,環境很優美。

在編譯之前先看一下我的機器環境:
1.linux yuchao-Latitude-E5410 2.6.35-22-generic #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 i686 GNU/Linux
2.gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
3.GNU Make 3.81 這個程序創建為 i686-pc-linux-gnu
4.GNU ld (GNU Binutils for Ubuntu) 2.20.51-system.20100908
5.svn,版本 1.6.12 (r955767)
編譯於 Mar 23 2011,12:56:23
6.Python 2.6.6
7.SCons by Steven Knight et al.:
script: v2.0.0.final.0.r5023, 2010/06/14 22:05:46, by scons on scons-dev
engine: v2.0.0.final.0.r5023, 2010/06/14 22:05:46, by scons on scons-dev
特別說明:SCons 是一個用 Python 語言編寫的類似於 make 工具的程序。與 make 工具相比較,SCons 的配置文件更加簡單清晰明了,
除此之外,它還有許多的優點。本文將簡單介紹如何在軟體開發項目中使用 SCons,通過本文,讀者可以學習到如何使用 SCons 來建造自己的程序項目。

6. V8引擎示例中如下的編譯選項什麼意思

V8和V10指的是引擎里的氣缸數缸數汽車發動機常用缸數有3、4、5、6、8、10、12缸。排量1升以下的發動機常用三缸,1-2.5升一般為四缸發動機,3升左右的發動機一般為6缸,4升左右為8缸,5.5升以上用12缸發動機。一般來說,在同等缸徑下,缸數越多,排量越大,功率越高;在同等排量下,缸數越多,缸徑越小,轉速可以提高,從而獲得較大的提升功率。6-12缸發動機一般採用V型排列,其中V10發動機主要裝在賽車上。V型發動機長度和高度尺寸小,布置起來非常方便,而且一般認為V型發動機是比較高級的發動機,也成為轎車級別的標志之一。V8發動機結構非常復雜,製造成本很高,所以使用的較少,V12發動機過大過重,只有極個別的高級轎車採用。2006賽季F1賽車引擎由3.0升V10變為2.4升V8,目的是為了降低各車隊的引擎研發等開支,同時提高比賽安全性。此項規則改動將導致引擎輸出功率相比2005賽季(900馬力左右)降低約200馬力。對於無法在2006賽季開始時獲得新規則規定的V8引擎的車隊,也允許其在限制引擎轉速的情況下,使用符合2005賽季技術規則的V10引擎。

7. V8編譯生成的機器碼究竟是什麼

實際上V8的JIT編譯器是直接在內存中生成機器碼的,並不會先生成文本形式的匯編然後再使用匯編器去轉換為機器碼。「動態生成機器碼」聽起來可能有點玄乎,其實根本沒啥,就是往內存里寫位元組,這些位元組正好是某些機器碼的意思,然後把這塊內存當作函數去調用就是了。由於代碼自身就是動態生成的,在生成的代碼里直接嵌入resolve好的各種值其實就相當於傳統編譯流程里的「動態鏈接」的效果。順手放倆我以前博客的傳送門:V8實際上自帶一個用C++實現的「匯編器庫」用來動態生成機器碼。它並不把文本形式的匯編轉換為機器碼,而是提供一組C++ API,調用這個API的函數就可以在內存里生成機器碼來。有興趣的同學可能會知道,V8的MacroAssembler庫源自Animorphic的Strongtalk VM,而Strongtalk VM也是HotSpot JVM的前輩。V8 Design Elements文檔里所描述的是最初期的V8的狀態。當時的V8隻有一個JIT編譯器,一個JavaScript函數通常只會被JIT編譯一次。這個JIT編譯器做的優化也不是很多。後來V8演化為擁有兩個JIT編譯器,一個初級編譯器(baseline compiler,名字叫做Full Code Generator,簡稱FullCodeGen),和一個優化編譯器(optimizing compiler,名字叫做Crankshaft),兩個編譯器結合在一次構成雙層編譯。JavaScript函數通常會先被FullCodeGen編譯,然後如果還繼續執行很多次的話則會再被Crankshaft重新編譯一遍,生成更優化的代碼。在這個架構中,FullCodeGen里生成的代碼還是跟V8 Design Elements的相似,會通過inline cache來實現property access;而這些inline cache不但用於實現fast property access,更重要的是它們會被用於收集profile,然後等到Crankshaft編譯的時候,它就可以看先前收集的profile來做profile-guided optimization。以這個 function foo(p) { return p.x } 為例,參數p沒有任何特別的地方,所以JavaScript引擎也無法知道p到底可能有怎樣的值。但通過FullCodeGen生成的代碼所收集到的profile信息,Crankshaft再去編譯 foo() 的時候就可以知道p之前通常指向一個Map(hidden class)為0x2c97ccb179d1的類型的對象。這個類型的constructor為Point、[[Prototype]] 為Point.prototype、對象里有足夠空間容納10個內嵌的欄位(in-object property),並且其中2個slot被用於存儲Smi類型,剩餘的8個slot未被使用。

閱讀全文

與v8編譯不過相關的資料

熱點內容
千聊免費課程可以重新加密嗎 瀏覽:507
python能代替php嗎 瀏覽:252
phpexcel樣式 瀏覽:265
安卓手機有沒有什麼軟體可以阻止彈廣告的 瀏覽:306
linux區域網搭建伺服器 瀏覽:690
python編譯器mac 瀏覽:293
windows的doc命令 瀏覽:463
nfc全加密門禁卡 瀏覽:636
身份信息被加密 瀏覽:482
我的鹽城app怎麼添加不了家庭成員 瀏覽:493
php商城並發 瀏覽:348
熊貓繪畫app怎麼做出大佬的筆刷 瀏覽:603
雲存儲伺服器知識 瀏覽:461
伺服器cpu是什麼指令集 瀏覽:590
糖貓t10怎麼安裝app 瀏覽:992
電腦加密u盤怎麼使用 瀏覽:517
linux如何升級php版本升級 瀏覽:841
二級程序員c語言難度 瀏覽:353
批處理編譯qt 瀏覽:67
鐵友app怎麼查詢機票訂單 瀏覽:197