2017-06-07 68 views
1

這是我得到error.I加載正確的opencv庫,但我得到這個錯誤。如果我去在ximgproc所有本地方法紅色標記爲「無法解析相應的jni函數name_function」。我該如何解決?無法解析相應的Jni函數opencv Android

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { 

     Uri uri = data.getData(); 
     try { 
      Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); 
      //Log.i("prova",uri.toString()); 
      ImageView imageView = (ImageView) findViewById(R.id.imageView); 
      // imageView.setImageBitmap(bitmap); 
      Mat g=new Mat(bitmap.getHeight(),bitmap.getWidth(), CvType.CV_8UC1); 
      Utils.bitmapToMat(bitmap,g,true); 
      SuperpixelSLIC x=Ximgproc.createSuperpixelSLIC(g,Ximgproc.SLIC,100,3); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

,這是我的錯誤:

06-07 19:24:01.370 21090-21090/com.example.jt1995.provaemo E/art: No implementation found for long org.opencv.ximgproc.Ximgproc.createSuperpixelSLIC_0(long, int, int, float) (tried Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10 and Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10__JIIF) 
06-07 19:24:01.370 21090-21090/com.example.jt1995.provaemo E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.jt1995.provaemo, PID: 21090 
                      java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.ximgproc.Ximgproc.createSuperpixelSLIC_0(long, int, int, float) (tried Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10 and Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10__JIIF) 
                       at org.opencv.ximgproc.Ximgproc.createSuperpixelSLIC_0(Native Method) 
                       at org.opencv.ximgproc.Ximgproc.createSuperpixelSLIC(Ximgproc.java:452) 
                       at com.example.jt1995.provaemo.MainActivity.onActivityResult(MainActivity.java:108) 
                       at android.app.Activity.dispatchActivityResult(Activity.java:6303) 
                       at android.app.ActivityThread.deliverResults(ActivityThread.java:3818) 
                       at android.app.ActivityThread.handleSendResult(ActivityThread.java:3865) 
                       at android.app.ActivityThread.access$1700(ActivityThread.java:159) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:135) 
                       at android.app.ActivityThread.main(ActivityThread.java:5569) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:372) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:726) 

回答

1

正如我解釋elsewhere,不要指望Android的工作室來解決神奇的本地方法聲明爲不與內置的gradle庫在集成externalNativeBuild

您可以簡單地忽略此錯誤消息:即使Android Studio將它們標記爲紅色,您的APK仍會安裝預建庫,並且本機方法將在運行時解析。

您可以添加@SuppressWarnings("JniMissingFunction")註解此方法,或者爲整個類:

@SuppressWarnings("JniMissingFunction") 
public class Ximgproc { 

或配置這種皮棉檢查對於給定的項目,或所有項目:

Preferences/Editor/Inspections

但這不能解決您的運行時問題。你可能已經構建了你的C++代碼來生成一個本地共享庫,假設它的名字是libXimgproc-native.so。如果它正確包裝到APK中,它將被提取到/data/app-lib/com.example.jt1995.provaemo/(您可以用getContext().getApplicationInfo().nativeLibraryDir查看此路徑)。

你的Java代碼,它試圖撥打org.opencv.ximgproc.Ximgproc類的本地方法前,應加載這個庫:

System.load("Ximgproc-native"); 

如果以上假設是正確的,鏈接器沒有在該庫中找到一個導出的函數,該函數實現了本地方法的createSuperpixelSLIC_0。它嘗試了Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10__JIIF

要檢查庫導出哪些方法,您可以使用作爲NDK gcc工具鏈一部分的工具nm工具。例如。在我的Mac上,這個可執行文件可以在~/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-nm找到。

運行…nm -D Ximgproc-native.so它將列出與T所有導出的函數庫。

我相信你不會在這個列表中找到你的功能。也許,這個名字有點不對。也許,您將CFLAGS設置爲-fvisibility = hidden,並且沒有明確聲明該函數爲JNIEXPORT(或__attribute__ ((visibility ("default"))))。也許,C++函數沒有用extern "C"聲明,並且它的名字被編譯器破壞了。

如果您使用靜態庫(xxx.a)作爲中間件來組裝生成的共享庫,您應該知道鏈接器可以丟棄未使用的外部函數。在這種情況下,使用LOCAL_WHOLE_STATIC_LIBRARIES而不是LOCAL_STATIC_LIBRARIES可能會有所幫助。

+0

這是我得到的「getContext()。getApplicationInfo()。nativeLibraryDir」:/data/app/com.example.jt1995.provaemo-1/lib/arm – Jt1995

+0

另一個問題,你寫了關於「Ximgproc-native .so「,在我的文件夾項目中,我有」libnincv_ximgproc.a「libs文件夾的」jniLibs「文件夾,但我寫了」.so「,我的是」.a「@AlexCohn – Jt1995

+0

最後,你需要一個*共享庫*這是「.so」。您可以使用*靜態庫*(「.a」)來構建共享庫,但通常這些靜態庫是造成混淆的原因。如果您使用'ndk-build'構建「libopencv_ximgproc.a」,則可以在** Android.mk **文件中將$(BUILD_STATIC_LIBRARY)更改爲$(BUILD_SHARED_LIBRARY)。 –

相關問題