㈠ android的動態載入和靜態載入的區別
兩者區別: 一,靜態庫的使用需要: 1 包含一個對應的頭文件告知編譯器lib文件裡面的具體內容 2 設置lib文件允許編譯器去查找已經編譯好的二進制代碼 二,動態庫的使用: 程序運行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫 三,依賴性: 靜態鏈接表示靜態性,在編譯鏈接之後, lib庫中需要的資源已經在可執行程序中了, 也就是靜態存在,沒有依賴性了 動態,就是實時性,在運行的時候載入需要的資源,那麼必須在運行的時候提供 需要的 動態庫,有依賴性, 運行時候沒有找到庫就不能運行了 四,區別: 簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。 做成靜態庫可執行文件本身比較大,但不必附帶動態庫 做成動態庫可執行文件本身比較小,但需要附帶動態庫 五: 首先糾正所謂「靜態連接就是把需要的庫函數放進你的exe之中」的說法。在真實世界中,有三個概念:Use static libary, static linked DLL, dynamic linked DLL. 多數人混淆了static libary 和 static linked DLL的概念,當然他們有似是而非的「相似之處」,比如都用到.lib,下面具體說明。 使用靜態庫(Use static libary)是把.lib和其他.obj一起build在目標文件中,目標文件可以是.exe,也可以是.dll或.oxc等。一般情況下,可以根本就沒有「對應的」.dll 文件,如C Run Time(CRT)庫。一個例子就是,寫一個main(){},build出來並不是只有幾個位元組,當然有人會說那還有exe文件頭呢?是,即使加上文件頭的尺寸,build出的執行文件仍然「莫名的大」。實際上那多出來的部分就是CRT靜態庫。姑且可以把靜態庫.lib理解成外部程序的obj文件比較合理,它包含了函數的實現。
㈡ 求幫寫一個在android手機上顯示obj文件
下面的List可用ArrayList替換
InputStream input;
BufferedReader reader;
try
{
List verticeLines = new List();
List textureLines = new List();
List normalLines = new List();
List verticeIndiceLines = new List();
List textureIndiceLines = new List();
List normalIndiceLines = new List();
input=new FileInputStream(data);
reader = new BufferedReader(new InputStreamReader(input));
String line = null;
while((line = reader.readLine()) != null)
{
//?狦琌猔稈┪?フ膥尿鉻筁
if(line.startsWith("//") ||line.startsWith("#")|| line.trim().equals(""))
{
continue;
}
String SPACE=" ";
String SLASH="/";
String[] st=RemoveNull(line.split(SPACE));
String lineType = st[0];
if(lineType.equals("v"))
{//郴翴畒夾
verticeLines.Add(st[1]);
verticeLines.Add(st[2]);
verticeLines.Add(st[3]);
}
else if(lineType.equals("vt"))
{//郴翴?借畒夾
textureLines.Add(st[1]);
textureLines.Add(st[2]);
}
else if(lineType.equals("vn"))
{//郴翴猭?秖
normalLines.Add(st[1]);
normalLines.Add(st[2]);
normalLines.Add(st[3]);
}
else if(lineType.equals("f"))
{//?à?癸萊?郴翴??借?猭?秖
//?艙畒夾
String v1=st[1];
String v2=st[2];
String v3=st[3];
String[] st1=v1.split(SLASH);
String[] st2=v2.split(SLASH);
String[] st3=v3.split(SLASH);
//頂點
verticeIndiceLines.Add(st1[0]);
verticeIndiceLines.Add(st2[0]);
verticeIndiceLines.Add(st3[0]);
//紋理
textureIndiceLines.Add(st1[1]);
textureIndiceLines.Add(st2[1]);
textureIndiceLines.Add(st3[1]);
//正常
normalIndiceLines.Add(st1[2]);
normalIndiceLines.Add(st2[2]);
normalIndiceLines.Add(st3[2]);
}
}
//郴翴畒夾:3?????郴翴
int indicesSize=verticeIndiceLines.Count();
indices=new short[indicesSize];
int verticeSize=indicesSize*3;
vertices=new float[verticeSize];
//?借畒夾:埃3т?碭?郴翴??2Τㄢ?畒夾
int textureSize=indicesSize*2;
textures=new float[textureSize];
//猭?秖:–?郴翴常Τ?艙猭?秖??3Τ3?よ??秖
int normalSize=indicesSize*3;
normals =new float[normalSize];
for(int i=0;i
{
//郴翴
indices[i]=(short)i;
int indice=Integer.valueOf(verticeIndiceLines.Item(i))-1;
//郴翴畒夾
vertices[i*3]=Float.valueOf(verticeLines.Item(indice*3));
vertices[i*3+1]=Float.valueOf(verticeLines.Item(indice*3+1));
vertices[i*3+2]=Float.valueOf(verticeLines.Item(indice*3+2));
if(!textureIndiceLines.Item(i).equals("")){
int textureIndice=Integer.valueOf(textureIndiceLines.ItemOrDefault(i, "0"))-1;
textures[i*2]=Float.valueOf(textureLines.ItemOrDefault(textureIndice*2,"0"));
textures[i*2+1]=Float.valueOf(textureLines.ItemOrDefault(textureIndice*2+1,"0"));
System.out.println(textureIndiceLines.Item(i));
}
//猭?秖畒夾
int normalIndice=Integer.valueOf(normalIndiceLines.Item(i))-1;
normals[i*3]=Float.valueOf(normalLines.Item(normalIndice*3));
normals[i*3+1]=Float.valueOf(normalLines.Item(normalIndice*3+1));
normals[i*3+2]=Float.valueOf(normalLines.Item(normalIndice*3+2));
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
㈢ 手機android文件夾下obb,obj,media都是干什麼的能刪除不
可以刪除的,但是,刪除以後就用不了這些 多媒體的文件夾了。一般是刪除文件,不刪除文件夾。
開心快樂每一天!哈哈哈!
㈣ 求助!在android中導入OBJ的3D模型怎麼導入,求具體方法
下面的List可用ArrayList替換
InputStream input;
BufferedReader reader;
try
{
List<String> verticeLines = new List<String>();
List<String> textureLines = new List<String>();
List<String> normalLines = new List<String>();
List<String> verticeIndiceLines = new List<String>();
List<String> textureIndiceLines = new List<String>();
List<String> normalIndiceLines = new List<String>();
input=new FileInputStream(data);
reader = new BufferedReader(new InputStreamReader(input));
String line = null;
while((line = reader.readLine()) != null)
{
//?狦琌猔稈┪?フ膥尿鉻筁
if(line.startsWith("//") ||line.startsWith("#")|| line.trim().equals(""))
{
continue;
}
String SPACE=" ";
String SLASH="/";
String[] st=RemoveNull(line.split(SPACE));
String lineType = st[0];
if(lineType.equals("v"))
{//郴翴畒夾
verticeLines.Add(st[1]);
verticeLines.Add(st[2]);
verticeLines.Add(st[3]);
}
else if(lineType.equals("vt"))
{//郴翴?借畒夾
textureLines.Add(st[1]);
textureLines.Add(st[2]);
}
else if(lineType.equals("vn"))
{//郴翴猭?秖
normalLines.Add(st[1]);
normalLines.Add(st[2]);
normalLines.Add(st[3]);
}
else if(lineType.equals("f"))
{//?à?癸萊?郴翴??借?猭?秖
//?艙畒夾
String v1=st[1];
String v2=st[2];
String v3=st[3];
String[] st1=v1.split(SLASH);
String[] st2=v2.split(SLASH);
String[] st3=v3.split(SLASH);
//頂點
verticeIndiceLines.Add(st1[0]);
verticeIndiceLines.Add(st2[0]);
verticeIndiceLines.Add(st3[0]);
//紋理
textureIndiceLines.Add(st1[1]);
textureIndiceLines.Add(st2[1]);
textureIndiceLines.Add(st3[1]);
//正常
normalIndiceLines.Add(st1[2]);
normalIndiceLines.Add(st2[2]);
normalIndiceLines.Add(st3[2]);
}
}
//郴翴畒夾:3?????郴翴
int indicesSize=verticeIndiceLines.Count();
indices=new short[indicesSize];
int verticeSize=indicesSize*3;
vertices=new float[verticeSize];
//?借畒夾:埃3т?碭?郴翴??2Τㄢ?畒夾
int textureSize=indicesSize*2;
textures=new float[textureSize];
//猭?秖:–?郴翴常Τ?艙猭?秖??3Τ3?よ??秖
int normalSize=indicesSize*3;
normals =new float[normalSize];
for(int i=0;i<verticeIndiceLines.Count();i++)
{
//郴翴
indices[i]=(short)i;
int indice=Integer.valueOf(verticeIndiceLines.Item(i))-1;
//郴翴畒夾
vertices[i*3]=Float.valueOf(verticeLines.Item(indice*3));
vertices[i*3+1]=Float.valueOf(verticeLines.Item(indice*3+1));
vertices[i*3+2]=Float.valueOf(verticeLines.Item(indice*3+2));
if(!textureIndiceLines.Item(i).equals("")){
int textureIndice=Integer.valueOf(textureIndiceLines.ItemOrDefault(i, "0"))-1;
textures[i*2]=Float.valueOf(textureLines.ItemOrDefault(textureIndice*2,"0"));
textures[i*2+1]=Float.valueOf(textureLines.ItemOrDefault(textureIndice*2+1,"0"));
System.out.println(textureIndiceLines.Item(i));
}
//猭?秖畒夾
int normalIndice=Integer.valueOf(normalIndiceLines.Item(i))-1;
normals[i*3]=Float.valueOf(normalLines.Item(normalIndice*3));
normals[i*3+1]=Float.valueOf(normalLines.Item(normalIndice*3+1));
normals[i*3+2]=Float.valueOf(normalLines.Item(normalIndice*3+2));
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}。
㈤ 安卓opengl能打開obj文件
軟體名稱:Quickoffice 移動辦公
[軟體大小:1.86MB]
[是否中文:中文]
[更新日期:2010-01-26 11:09]
[軟體格式:apk]
[開 發 者:]
[適用手機:Android Android1.5,Android1.6,Android2.1,Android2.2機型]
望採納。
㈥ 打包android的時候怎麼引入一些靜態庫
方法1 :
人為建立上面的文件夾並將靜態庫拷入;
方法2 :
就是通過編譯配置來做上面的動作。具體如下:
1. 將動態庫的編譯部分和靜態庫的編譯部分分開;
2. 在工作目錄下建立一個lib文件夾(必須是這個名字),將第三方的靜態庫拷貝進去,並且增加一個編譯配置文件Android.mk,具體內容如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
這個編譯配置文件就是要在obj下生成中間文件,供其他地方使用。
文件列表如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
3. 在工作目錄下建立一個文件夾,並且將生成動態庫的相關文件全部拷貝進去。這里我們起的名字是src,當然也可以起其他名字。Android.mk內容如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
這里只要直接引入第三方庫就可以了。
文件列表如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
third_lib.h是靜態庫的頭文件,test.cpp很簡單,就是一個函數裡面順序調了一下靜態庫里開放的函數,內容如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
3. 工作目錄下增加一個編譯配置文件Android.mk,作用就是查找工作目錄下所有的子目錄中的Android.mk來編譯。Android.mk的內容如下:
Android <wbr>: <wbr>編譯動態庫時如何引入靜態庫
好,工作都做完了,下面進入工作目錄mm -B 試一下,可以順利編譯成功。