2016-07-10 17 views
0

我想用Java to smali plugin,但我必須編譯Java類第一,這是不可能的這樣如何調用Smali在Java中

enter image description here

項目的h.m

enter image description here

Javac不明白這一點,但我只是想編譯這個java代碼到類中,所以我可以將它轉換爲smali。

這個項目是由apktool d my.apk解碼,我嘗試注入一些代碼,寫smali比java.But困難我讀完Inject部分,只是想知道如何編譯java到類。

$ adb logcat -s "Injected" 
--------- beginning of main 
--------- beginning of system 
07-10 19:32:24.013 7689 7689 W Injected: Started 
07-10 19:32:24.015 7689 7689 W Injected: Init 

編輯

原來的名稱是In Jetbrain can I just compile Java to class and ignore all error?,但要我要爲How to call Smali in Java,所以我重新命名的標題。

+0

寫一個虛擬的Java類具有相同的名稱爲'h'variable和領域'l'和'M'像smali什麼?然後,您將能夠將您的原始代碼文件編譯爲課程,並丟棄爲該虛擬課程生成的代碼文件。 –

+0

有太多的虛擬類寫,所以我選擇[這種方式](http://stackoverflow.com/a/38298127/1870054) – wener

+0

沒有注意到第二個答案是你的。可能它應該是被接受的。 –

回答

3

爪哇需要在Java程序中所使用的類/方法/字段的的定義,以便能夠對其進行編譯。沒有這些信息,它沒有足夠的信息來生成類文件。

例如,假設你想編譯這個程序:

public class Main { 
    public static int main(String[] args) { 
     Blort blort = new Blort(); 
     blort.blarg("blurg!"); 
     return 0; 
    } 
} 

所產生的確切字節碼依賴於Blort.blarg方法的定義。

如果blarg的定義是這樣的:

public class Blort { 
    public void blarg(String blah) { 
     System.out.println(blah); 
    } 
} 

然後,該方法調用blarg將遵守到:

invoke-virtual {v0, v1}, LBlort;->blarg(Ljava/lang/String;)V 

但是,如果blarg方法有不同的定義:

public class Blort { 
    public void blarg(CharSequence blah) { 
     System.out.println(blah); 
    } 
} 

然後該方法調用將編譯爲:

invoke-virtual {v0, v1}, LBlort;->blarg(Ljava/lang/CharSequence;)V 

這兩個方法調用指的是不同的方法,不可互換。如果編譯器至少不知道blarg方法的聲明,那麼它就不知道要使用的正確的方法簽名。

這只是一個小例子,爲什麼編譯器需要知道所有在java程序中引用的類的定義。還有很多其他原因。

0

Java不能這樣做,但是這裏有一個解決方法,它可以很好地工作。

  1. 找到classes.dex
  2. 使用dex2jar將其轉換爲罐子
  3. 添加罐子到項目
  4. 現在你可以在你的代碼中直接調用smali代碼。

    unzip my.apk -d apk 
    d2j-dex2jar my/classes.dex 
    # Add classes-dex2jar.jar to project