2013-08-11 41 views
9

Tôi đang cố sử dụng thư viện sqlitecipher yêu cầu sử dụng thư viện gốc. Hướng dẫn của họ rất đơn giản nhưng nó không hiệu quả với tôi. Mỗi khi tôi nhận được lỗi sau:Thư viện gốc (các tệp .so) không được thêm vào dự án android

FATAL EXCEPTION: main 
     java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader[dexPath=/data/app/org.example.test-2.apk,libraryPath=/data/app-lib/org.example.test-2]: findLibrary returned null 
     at java.lang.Runtime.loadLibrary(Runtime.java:365) 
     at java.lang.System.loadLibrary(System.java:535) 
     at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:141) 
     at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:136) 

nó có nghĩa là các tệp này không được đính kèm trong khi biên soạn.

tất cả 3 tệp được lưu trữ trong thư mục/libs/armeabi /.

Tôi giả định rằng vấn đề là tôi sử dụng maven để quản lý các phụ thuộc (xây dựng được thực hiện bằng cách sử dụng Android Studio anyways). Lần thử tiếp theo - bao gồm các thư viện đó vào các phụ thuộc maven. Theo documentation nó là khá dễ dàng. Tôi không thể tìm thấy chúng trong một kho lưu trữ công cộng vì vậy tôi đã sử dụng <scope>system</scope> bằng thẻ. Chúng được nhìn thấy nhưng nó không hoạt động. Sau đó tìm thấy this liên kết nơi người ta nói rằng phạm vi "hệ thống" sẽ không làm việc, thử thêm các thư viện vào kho lưu trữ địa phương sử dụng

mvn install:install-file -DgroupId=net.sqlitecipher -DartifactId=stlport_shared -Dversion=1.0 -Dfile=libstlport_shared.so -Dpackaging=so -DgeneratePom=true 

cuối cùng - nó đã không làm việc.

Ngoài ra tôi thấy điều này topic, có lẽ đây là một giải pháp nhưng tôi không sử dụng gradle hiện tại. Có cách nào để bao gồm các tập tin .so vào apk mà không cần di chuyển từ maven sang gradle?

Như tôi đã hiểu Android Studio sử dụng gradle nội bộ để xây dựng apks, vì vậy tất cả những nỗ lực của tôi với maven là vô ích cho đến khi họ bắt đầu hỗ trợ thư viện bản địa, tôi có đúng không? Tôi cũng đã cố gắng xây dựng dự án với Intellij IDEA Cardea (13.0), thật không may mà không thành công.

+1

Các tệp có thực sự trong APK không? Bạn có thể sử dụng giải nén để mở APK. – Frohnzie

+0

đó là một vấn đề - chúng không có trong gói ứng dụng.Tôi có thể sao chép chúng vào thư mục tài sản và sau đó tải libs từ thư mục cụ thể (thực sự bình luận của bạn đã giúp tôi nhận ra rằng, cảm ơn) nhưng tôi muốn làm điều đó một cách thích hợp. Nó có thể trong tương lai. – Ruzard

+1

NDK không được hỗ trợ trong AssetStudio/gradle. Bạn đã thử tạo dự án với Eclipse hay Ant chưa? Đối với một số lý do các tập tin .so không nhận được đóng gói. Nếu bạn quyết định sao chép tệp từ thư mục assest, hãy đảm bảo bạn sử dụng java.lang.Runtime.load và cung cấp đường dẫn đầy đủ. – Frohnzie

Trả lời

10

Ngay khi lib gốc có trong/libs/armeabi/tất cả những gì bạn phải làm là định cấu hình plugin android đúng cách. Một cái gì đó như thế này:

<plugin> 
    <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
    <artifactId>android-maven-plugin</artifactId> 
    <configuration> 
     <nativeLibrariesDirectory>${project.basedir}/libs</nativeLibrariesDirectory> 
     ... 
    </configuration> 
    <extensions>true</extensions> 
</plugin> 
+1

Cảm ơn câu trả lời của bạn, nó đã giúp tôi. Tôi vẫn không thể tin rằng tôi đã bỏ lỡ dòng "nativeLibrariesDirectory", nó chỉ trỏ đến thư mục sai trong trường hợp của tôi. cách giải quyết của tôi là sao chép thư viện từ thư mục tài sản sang thư mục tùy chỉnh (nếu không có đường dẫn đến tệp này) khi khởi động và gửi đường dẫn đến sqlcipher để tải bản sao thư viện từ thư mục tùy chỉnh (mà tôi cần viết lại hàm gọi trước). Chết tiệt, không thể tin rằng giải pháp là dễ dàng. – Ruzard

+0

@ ben75 sẽ cho phép bạn thay thế hoặc thay đổi thư viện hệ thống hiện tại? Tại sao tôi hỏi là để 3 tệp này (libaudio.so, libaudioflinger.so, libaudiopolicy.so) có thể được thay thế để cho phép ghi âm voice_call từ cả hai đầu của cuộc gọi. Android hiện đang gặp sự cố với tính năng ghi âm giọng nói. Một số thiết bị (được sửa đổi với roms tùy chỉnh) cho phép ghi âm giọng nói. Nhưng nếu chúng ta có thể tìm cách thay thế 3 tệp này trên bất kỳ thiết bị Android nào, điều đó sẽ là một đột phá lớn khi có hàng nghìn người dùng Android muốn ghi lại cuộc gọi điện thoại, nhưng đơn giản là không thể. – Pierre

+0

@Pierre Tôi không nghĩ rằng có thể sửa đổi thư viện hệ thống mà không cần root thiết bị của bạn. (bài đăng này liên quan đến thư viện gốc "riêng tư" đối với gói ứng dụng/người dùng) – ben75

1

Câu hỏi 1: Có. Tôi chưa từng có vấn đề cụ thể này trước đây, nhưng về mặt sinh học, bạn không cần phải swich để tốt nghiệp. Có thể sử dụng tác vụ kiến ​​để thêm các tệp SO vào APK. Và kể từ khi maven có thể chạy Ant nhiệm vụ nó có thể.

nativeLibsToJar mà bạn tìm thấy here không có gì khác ngoài tác vụ đặt tất cả các tệp SO vào tệp ZIP và sau đó sử dụng phần mở rộng JAR thay vì ZIP. Bạn có thể dễ dàng làm điều đó với Ant task Zip (và có thể thêm rename).

Câu hỏi 2: Không. Vì câu trả lời đầu tiên. Không cần "maven hỗ trợ thư viện bản địa". Chỉ cần sử dụng Ant làm hệ thống xây dựng.

+0

Tôi đánh giá cao câu trả lời của bạn, nhưng hãy nhìn vào câu trả lời của ben75 – Ruzard

+0

@Ruzard Có, có nó đi. Cách của tôi ở đây cũng là mô tả về một hack. ben75 nói cho bạn biết cách thực sự. Một ngày nữa, chúng ta sẽ thông minh hơn để ngủ hơn là chúng ta thức dậy :) –

1

Bạn phải tạo thư mục jni cho tập tin .so bao gồm trong dự án android sử dụng android studio.

Tôi có hình ảnh đính kèm, vui lòng thực hiện theo các bước sau.

Sau khi tạo thư mục jnilib, bạn có thể đặt tất cả các tệp .so trong thư mục này. enter image description here