kotlin androidpdfviewer lib 似乎没有加载
kotlin androidpdfviewer lib doesn't seem to load
我正在使用 android pdfviewer lib 打开和阅读 pdf,位于:https://github.com/barteksc/AndroidPdfViewer
但是当我尝试启动 pdf 时出现错误:
E/zygote64:未找到 long com.shockwave.pdfium.PdfiumCore.nativeOpenDocument(int, java.lang.String) 的实现(已尝试 Java_com_shockwave_pdfium_PdfiumCore_nativeOpenDocument 和 Java_com_shockwave_pdfium_PdfiumCore_nativeOpenDocument__ILjava_lang_String_2)
E/PDFView: 加载pdf错误
java.lang.UnsatisfiedLinkError:未找到 long com.shockwave.pdfium.PdfiumCore.nativeOpenDocument(int, java.lang.String) 的实现(已尝试 Java_com_shockwave_pdfium_PdfiumCore_nativeOpenDocument 和 Java_com_shockwave_pdfium_PdfiumCore_nativeOpenDocument__ILjava_lang_String_2)
我尝试了不同的依赖实现,但 none 成功了:
implementation 'com.github.barteksc:pdfium-android:1.9.0'
implementation "com.github.barteksc:android-pdf-viewer:3.2.0-beta.1"
implementation "com.github.barteksc:android-pdf-viewer:2.8.2"
这里发现错误:
public PdfDocument newDocument(ParcelFileDescriptor fd, String password) throws IOException {
PdfDocument document = new PdfDocument();
document.parcelFileDescriptor = fd;
synchronized (lock) {
document.mNativeDocPtr = nativeOpenDocument(getNumFd(fd), password);
}
return document;
}
似乎无法加载库中的 nativeOpenDocument 函数。
我在 github 上找到了一些谈论它的话题:https://github.com/barteksc/AndroidPdfViewer/issues/538
https://github.com/barteksc/PdfiumAndroid/issues/54
https://github.com/mshockwave/PdfiumAndroid/issues/13
但没有找到解决方案,正如建议的那样,我尝试更改依赖关系,尝试关闭我的计算机和我的 phone,尝试使缓存无效并重新启动,在模拟器上尝试但没有任何效果。
如果有人能帮我解决这个问题就太好了?
这就是我加载 pdf 的方式 url:
fragment_pdf_reader.xml:
<androidx.constraintlayout.widget.ConstraintLayout
//....
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="@dimen/zeroDp"
android:visibility="visible"
app:layout_constraintBottom_toTopOf="@+id/tvFeedback"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/view" />
//...
</androidx.constraintlayout.widget.ConstraintLayout>
现在在您的片段中获取 pdf url 并使用该 pdf url 发出 Http 请求并获取 ResponseBody 将其传递给以下方法:
private fun downloadFile(responseBody: ResponseBody) {// get responseBody after making Http req . I'm using retrofit
binding?.let {
//it.pdfView.removeAllViews()
it.pdfView.fromBytes(responseBody.bytes())
.defaultPage(pageNumber)
.onPageChange(this@PdfReaderFragment)
.enableAnnotationRendering(true)
.onLoad(this@PdfReaderFragment)
.spacing(10) // in dp
.onPageError(this@PdfReaderFragment)
.onError { onError("File not in PDF format or corrupted") }
.load()
}
}
实现这些回调:
OnPageChangeListener
OnLoadCompleteListener
OnPageErrorListener
以上回调的实现是:
override fun loadComplete(nbPages: Int) {
binding?.let {
printBookmarksTree(it.pdfView.tableOfContents, "-")
}
}
override fun onPageError(page: Int, t: Throwable?) {
Log.d("PDF", t?.message)
}
override fun onPageChanged(page: Int, pageCount: Int) {
pageNumber = page
Log.d("PDF", "Page number $pageNumber $pageCount")
setTitleMessageBackArrow(String.format("%s %s / %s", "your fragment title", page + 1, pageCount))
}
private fun printBookmarksTree(tree: List<Bookmark>, sep: String) {
for (b in tree) {
Log.e("PDF", String.format("%s %s, p %d", sep, b.title, b.pageIdx))
if (b.hasChildren()) {
printBookmarksTree(b.children, "$sep-")
}
}
}
我刚刚发现,在我的情况下,我有一个应用程序和一个模块,其中是我自己的库 aar,我在其中使用了 androidpdfviewer。
问题是我只依赖于库而不是应用程序。
为了解决这个问题,我不得不在应用程序和库中添加依赖项。现在看起来很明显我看到我有 2 build.gradle。现在一切正常。
在你 build.gradle 添加 classpath 'com.github.barteksc:pdfium-android:1.9.0'
但项目不是模块。
我正在使用 android pdfviewer lib 打开和阅读 pdf,位于:https://github.com/barteksc/AndroidPdfViewer
但是当我尝试启动 pdf 时出现错误:
E/zygote64:未找到 long com.shockwave.pdfium.PdfiumCore.nativeOpenDocument(int, java.lang.String) 的实现(已尝试 Java_com_shockwave_pdfium_PdfiumCore_nativeOpenDocument 和 Java_com_shockwave_pdfium_PdfiumCore_nativeOpenDocument__ILjava_lang_String_2)
E/PDFView: 加载pdf错误 java.lang.UnsatisfiedLinkError:未找到 long com.shockwave.pdfium.PdfiumCore.nativeOpenDocument(int, java.lang.String) 的实现(已尝试 Java_com_shockwave_pdfium_PdfiumCore_nativeOpenDocument 和 Java_com_shockwave_pdfium_PdfiumCore_nativeOpenDocument__ILjava_lang_String_2)
我尝试了不同的依赖实现,但 none 成功了:
implementation 'com.github.barteksc:pdfium-android:1.9.0'
implementation "com.github.barteksc:android-pdf-viewer:3.2.0-beta.1"
implementation "com.github.barteksc:android-pdf-viewer:2.8.2"
这里发现错误:
public PdfDocument newDocument(ParcelFileDescriptor fd, String password) throws IOException {
PdfDocument document = new PdfDocument();
document.parcelFileDescriptor = fd;
synchronized (lock) {
document.mNativeDocPtr = nativeOpenDocument(getNumFd(fd), password);
}
return document;
}
似乎无法加载库中的 nativeOpenDocument 函数。
我在 github 上找到了一些谈论它的话题:https://github.com/barteksc/AndroidPdfViewer/issues/538 https://github.com/barteksc/PdfiumAndroid/issues/54 https://github.com/mshockwave/PdfiumAndroid/issues/13
但没有找到解决方案,正如建议的那样,我尝试更改依赖关系,尝试关闭我的计算机和我的 phone,尝试使缓存无效并重新启动,在模拟器上尝试但没有任何效果。
如果有人能帮我解决这个问题就太好了?
这就是我加载 pdf 的方式 url:
fragment_pdf_reader.xml:
<androidx.constraintlayout.widget.ConstraintLayout
//....
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="@dimen/zeroDp"
android:visibility="visible"
app:layout_constraintBottom_toTopOf="@+id/tvFeedback"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/view" />
//...
</androidx.constraintlayout.widget.ConstraintLayout>
现在在您的片段中获取 pdf url 并使用该 pdf url 发出 Http 请求并获取 ResponseBody 将其传递给以下方法:
private fun downloadFile(responseBody: ResponseBody) {// get responseBody after making Http req . I'm using retrofit
binding?.let {
//it.pdfView.removeAllViews()
it.pdfView.fromBytes(responseBody.bytes())
.defaultPage(pageNumber)
.onPageChange(this@PdfReaderFragment)
.enableAnnotationRendering(true)
.onLoad(this@PdfReaderFragment)
.spacing(10) // in dp
.onPageError(this@PdfReaderFragment)
.onError { onError("File not in PDF format or corrupted") }
.load()
}
}
实现这些回调:
OnPageChangeListener
OnLoadCompleteListener
OnPageErrorListener
以上回调的实现是:
override fun loadComplete(nbPages: Int) {
binding?.let {
printBookmarksTree(it.pdfView.tableOfContents, "-")
}
}
override fun onPageError(page: Int, t: Throwable?) {
Log.d("PDF", t?.message)
}
override fun onPageChanged(page: Int, pageCount: Int) {
pageNumber = page
Log.d("PDF", "Page number $pageNumber $pageCount")
setTitleMessageBackArrow(String.format("%s %s / %s", "your fragment title", page + 1, pageCount))
}
private fun printBookmarksTree(tree: List<Bookmark>, sep: String) {
for (b in tree) {
Log.e("PDF", String.format("%s %s, p %d", sep, b.title, b.pageIdx))
if (b.hasChildren()) {
printBookmarksTree(b.children, "$sep-")
}
}
}
我刚刚发现,在我的情况下,我有一个应用程序和一个模块,其中是我自己的库 aar,我在其中使用了 androidpdfviewer。
问题是我只依赖于库而不是应用程序。
为了解决这个问题,我不得不在应用程序和库中添加依赖项。现在看起来很明显我看到我有 2 build.gradle。现在一切正常。
在你 build.gradle 添加 classpath 'com.github.barteksc:pdfium-android:1.9.0'
但项目不是模块。