2012-04-02 4 views
12

Tôi cần trợ giúp trong javah và android-ndk.JAVAH không thể tìm thấy lớp học (android ndk)

Tôi đã cố gắng tạo tệp H cho phương pháp gốc của mình, nhưng javah cho biết không tìm thấy tệp lớp.

lớp mục tiêu của tôi có tuyệt đối tên $ PROJECT_DIRECTORY/src/BT/nativeclient/BtnativeActivity.java và chứa theo mã:

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"); 
    } 
} 

Tôi tryed để bắt đầu javah từ sau pathes:

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

Tôi đã cố gắng chỉ định -classpath đường dẫn:

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

Tôi tryed để xác định android.jar như đã đề cập there:

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

Nhưng tôi luôn luôn chỉ nhận được một kết quả:

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. 

Hơn nữa, với -verbose tùy chọn lệnh javah nói rằng lệnh này đã được rao giảng lớp của tôi nó là nơi hợp lệ:

$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. 

Tôi nghĩ rằng tôi đã mất một số điều quan trọng, nhưng tôi vẫn không thể tìm thấy giải pháp.

Ai đó có thể giúp tôi không?

+0

không lệnh javac công trình? – Lucifer

Trả lời

25

Phần kiến ​​của hệ thống xây dựng Android thực sự đặt các tệp lớp học trong bin/classes. Vì vậy, bạn cần có $PROJECT_DIRECTORY/bin/classes trên đường dẫn lớp học javah. Ví dụ: từ thư mục src bạn có thể chạy:

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

Giả định rằng bạn đã biên dịch mã Java của mình thành các tệp lớp tương ứng trước. Bạn có thể kiểm tra bằng cách xem những gì nằm trong thư mục bin/classes - nó sẽ chứa thư mục bt, đây là thư mục đầu của tên gói của bạn.

+2

Cảm ơn rất nhiều! Nó đang hoạt động –

+0

Không thể tin được, nó cũng hiệu quả với tôi: D –

+0

Làm việc tốt cho tôi, thnx rất nhiều để tiết kiệm thời gian của tôi –

2

Trong trường hợp của tôi, vấn đề là Windows Java nằm trong đường dẫn trước java Android. Vì vậy, kiểm tra (trong Cygwin) mà javah bạn đang sử dụng (mà javah), và nếu đường dẫn không nhìn đúng, sửa chữa đường dẫn.

0

trong trường hợp của tôi, tôi phải đổi tên gói của mình từ 'com.examples.cam' thành một thứ khác. Sau đó, javah làm việc đúng cách. Trước khi tôi gặp lỗi "không tìm thấy lớp".

0

@richq hoàn toàn đúng. Nhưng có một điều nữa mà tôi muốn thêm vào. (Và phần lớn đã giải quyết buổi sáng của tôi)

Trong khi chỉ định đường dẫn class = Không sử dụng. /bin/classes:~/ProjectFolder/bin/classes (the tilde representing the Home directory)

Nhưng sử dụng "../../" để chuyển đổi thư mục.Vì một số lý do, javah không nhận ra toán tử dấu ngã cho thư mục chính.

Cũng có một điều khác nếu lớp có một sự phụ thuộc vào dự án khác sau đó bạn sẽ cần điều đó cũng trong classpath

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

Thậm chí, tôi đã bị mắc kẹt với điều này trong một thời gian và trả lời richq mà làm việc giống như một quyến rũ. Tôi muốn thêm rằng trong classpath bạn chỉ nên cung cấp đường dẫn cho đến khi bắt đầu gói của bạn (hầu hết các dự án của nó một cấp trước khi com). Đối với đối số tiếp theo, hãy cung cấp đường dẫn tệp lớp bên trong các gói của bạn (ví dụ: bắt đầu từ com.mypackage.myclass) Ngoài ra, không thêm tên lớp có phần mở rộng '.java'.

từ 'src' của gói của bạn

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