2012-04-02 207 views
12

我需要javah和android-ndk的幫助。JAVAH找不到類(android ndk)

我tryed生成H-文件我的本地方法,但JAVAH類文件未找到

我的目標類有絕對的名稱$ PROJECT_DIRECTORY/的src/BT/nativeclient/BtnativeActivity.java,包含跟隨代碼:

package bt.nativeclient; 

import android.app.Activity; import android.os.Bundle; import android.widget.TextView; 

public class BtnativeActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     TextView tv = new TextView(this); 
     tv.setText(stringFromJNI()); 
     setContentView(tv); 
    } 

    public native String stringFromJNI(); 

    static 
    { 
     System.loadLibrary("hello-jni"); 
    } 
} 

我tryed開始JAVAH從如下pathes:

$(PROJECT_DIRECTORY)/bin$ javah -jni bt.nativeclient.BtnativeActivity 
$(PROJECT_DIRECTORY)/jni$ javah -jni bt.nativeclient.BtnativeActivity 
$(PROJECT_DIRECTORY)$ javah -jni bt.nativeclient.BtnativeActivity 

我試着指定-classpath修改:

$PROJECT_DIRECTORY/src$ javah -classpath :. bt.nativeclient.BtnativeActivity 

我tryed指定的android.jar提到​​:

$PROJECT_DIRECTORY/bin$ javah -classpath :/home/l/android-sdks/platforms/android-10/android.jar:. bt.nativeclient.BtnativeActivity 

但我總是得到結果只有一個:

error: cannot access bt.nativeclient.BtnativeActivity 
class file for bt.nativeclient.BtnativeActivity not found 
javadoc: error - Class bt.nativeclient.BtnativeActivity not found. 
Error: No classes were specified on the command line. Try -help. 

而且,隨着-verbose選項命令javah說,這個命令是seaching我的類它有效的地方:

$PROJECT_DIRECTORY/src$ javah **-verbose** -classpath :/home/l/android-sdks/platforms/android-10/android.jar:. bt.nativeclient.BtnativeActivity 
error: cannot access bt.nativeclient.BtnativeActivity 
class file for bt.nativeclient.BtnativeActivity not found 
javadoc: error - Class bt.nativeclient.BtnativeActivity not found. 
[ Search Path: /usr/lib/jvm/java-6-openjdk/jre/lib/resources.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/jsse.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/jce.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/charsets.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/netx.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/plugin.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/modules/jdk.boot.jar:/usr/lib/jvm/java-6-openjdk/jre/classes/:/home/l/android-sdks/platforms/android-10/android.jar:. ] 
Error: No classes were specified on the command line. Try -help. 

我覺得我失去了一些重要的東西,但我仍然無法找到解決方案。

請問有人可以幫我嗎?

+0

不javac的命令的作品? – Lucifer 2012-04-03 03:46:31

回答

25

Android構建系統的螞蟻部分實際上將類文件放置在bin/classes中。所以你需要在javah類路徑上有$PROJECT_DIRECTORY/bin/classes。例如,您可以從src目錄運行:

$PROJECT_DIRECTORY/src$ javah -classpath ../bin/classes bt.nativeclient.BtnativeActivity 

這假設您已經將Java代碼編譯爲相應的類文件。您可以通過查看bin/classes目錄中的內容來進行檢查 - 它應該包含bt目錄,這是您的軟件包名稱的頂部。

+2

非常感謝!這是工作 – 2012-04-03 19:33:50

+0

不能相信,它也適用於我:D – 2012-10-06 15:54:59

+0

它對我的工作很好,thnx很多,以節省我的時間 – 2012-11-15 16:20:06

2

在我的情況下,問題是Windows Java在Android java之前的路徑中。 因此,請檢查(在cygwin中)您正在使用哪個javah(哪個javah),如果路徑看起來不正確,請修復路徑。

0

在我的情況下,我不得不將我的包從'com.examples.cam'重命名爲其他東西。然後javah正常工作。在我有相同的「類未找到」錯誤之前。

0

@richq是絕對正確的。但還有一件事是我想補充的。 (並且哪個佔用了我早晨的大部分時間來解決這個問題)

雖然指定classpath = Refrain使用。 /bin/classes:~/ProjectFolder/bin/classes (the tilde representing the Home directory)

但是使用「../../」切換目錄。出於某種原因,javah不能識別主目錄的波浪符操作符。

另外一件事如果類對其他項目的依賴,那麼你就需要一個以及在classpath

[email protected]:~/SomeProject javah -classpath ./bin/classes:../<Whereever the path is>/SomeOtherDependentProject:../<Path to android-sdk>/android.jar <Qualified class path> 
0

連我都堅持了一會兒,並回答richq工作就像一個魅力。 我想補充一點,在classpath中,你應該只提供直到你的包開始的路徑(大多數項目是在com之前的一個級別)。對於下一個參數,請在您的包內部提供類文件路徑(即從com.mypackage.myclass開始) 另外,請勿將類名稱附加'.java'擴展名。

從你的包 'SRC'

javah -classpath ../package1/package2/.. com.mypackage.myclassname