2016-03-21 133 views
1

我有一個本機庫('處理器'),我正在使用依賴libjpeg的Android NDK構建。但是,這個問題可能與Android方面無關。我已經成功地建立了圖書館,但是當我嘗試運行庫無法與此錯誤正確加載:如果我nm -D processor.so它確實包含符號找不到符號

failed: dlopen failed: cannot locate symbol "jpeg_mem_src" 

但是:

... 
U jpeg_CreateCompress 
U jpeg_CreateDecompress 
U jpeg_destroy_compress 
U jpeg_destroy_decompress 
U jpeg_finish_compress 
U jpeg_finish_decompress 
U jpeg_mem_dest 
U jpeg_mem_src 
U jpeg_read_header 
U jpeg_read_scanlines 
... 

處理器的build.gradle:

sources { 
    main { 
     jni { 
      dependencies { 
       project ":jpeg" 
      } 
     } 
    } 
} 

ndk { 
    moduleName "processor" 
    cppFlags.add("-fexceptions") 
    ldLibs.add("log") 
    stl "gnustl_shared" 
} 

Java端加載它

任何想法爲什麼符號存在,但無法找到?謝謝!

回答

2

取決於Android的版本中,你將不得不手動加載JPEG文件(並將其包含在您的APK呢!)

所以只需添加一個System.loadLibrary("jpeg");到你的靜態塊,它應該做的伎倆。

順便說一句,你可以在你的.so文件中看到符號的事實只意味着你的文件正在使用它們,而不是你的.so提供了一個實現。您可以看到它爲nmU字母報告符號,undefined

+0

啊,謝謝。所以如果他們沒有定義'U',那麼我可能在生成圖書館時做了錯誤的事情? (我已經嘗試添加'System.loadLibrary(「jpeg」)',但我得到相同的錯誤,所以有可能我由於某種原因生成了所有庫) – Anthony

+0

在libjpeg.so中: 000000000001dca0 T jpeg_mem_src – Anthony

+0

您的庫取決於libjpeg(如在build.gradle文件的依賴項塊中所述)。這意味着你的庫需要'libjpeg.so'文件在被加載之前被加載。你可以通過在你的文件上運行'readelf -d'來檢查它,ti會顯示你所有其他需要的共享庫。您可以安全地忽略libc,因爲它始終由Android加載,但您必須手動加載其他libc。 – NiBZ