2016-06-27 129 views
4

我嘗試了原生的書面共享庫集成到我的應用程序時,它說,在jniLibs和其他庫.so文件無法加載找到的實現。java.lang.UnsatisfiedLinkError中:沒有因庫不加載

這裏是C文件

#include <string.h> 
#include <jni.h> 
#include <dummy.h> 

JNIEXPORT jstring 
Java_com_example_hellojni_HelloJni_DummyInit(JNIEnv*env, jobject thiz) { 

    dummy *handle; 
    char *msg; 
    int rc = dummy_init_from_id("ml", &handle, &msg); 
    if (rc == DUMMY_SUCCESS) { 
     return (*env)->NewStringUTF(env, "Init was successful"); 
    } else { 
     return (*env)->NewStringUTF(env, msg); 
    } 

} 

JNIEXPORT void 
Java_com_example_hellojni_HelloJni_DummySetSymbolsDir(JNIEnv *env, jobject thiz, 
                 jstring dir) { 
    dummy_set_symbols_dir(dir); 

} 

這裏是Java文件下面

FATAL EXCEPTION: main 
Process: com.example.hellojni, PID: 2558 
java.lang.UnsatisfiedLinkError: No implementation found for void com.example.hellojni.HelloJni.DummySetSymbolsDir(java.lang.String) (tried Java_com_example_hellojni_HelloJni_DummySetSymbolsDir and Java_com_example_hellojni_HelloJni_DummySetSymbolsDir__Ljava_lang_String_2) 
at com.example.hellojni.HelloJni.DummySetSymbolsDir(Native Method) 
at com.example.hellojni.HelloJni.onCreate(HelloJni.java:34) 
at android.app.Activity.performCreate(Activity.java:6237) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

給出

package com.example.hellojni; 

import android.app.Activity; 
import android.util.Log; 
import android.widget.TextView; 
import android.os.Bundle; 
import java.io.File; 


public class HelloJni extends Activity 
{ 


    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 

     super.onCreate(savedInstanceState); 

     File f = new File(getAssets() + "/ml"); 
     if (f.exists()) try { 

      System.out.println("Scheme exists"); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
     String dir = f.getPath(); 

     DummySetSymbolsDir(dir); 

     TextView tv = new TextView(this); 
     tv.setText(DummyInit()); 
     setContentView(tv); 
    } 


    /*** Native Methods ***/ 
    public native String DummyInit(); 
    public native void DummySetSymbolsDir(String dir); 

    static { 
     try { 
      System.loadLibrary(("dummy")); 
     } catch (UnsatisfiedLinkError e) { 
      Log.e("JNI", "Warning:Could not use dummy library"); 
     } 
     try { 
      System.loadLibrary("libs/libpthead.so"); 
     } catch (UnsatisfiedLinkError e) { 
      Log.e("JNI", "Warning:Could not use lipthread library"); 
     } 
     try { 
      System.loadLibrary("hello-jni"); 
     } catch (UnsatisfiedLinkError e) { 
      Log.e("JNI", "Warning:Could not use hello-jni library"); 
     } 
    } 
} 

確切的錯誤的Android.mk文件如下

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := hello-jni 
LOCAL_SRC_FILES := hello-jni.c 
include $(BUILD_SHARED_LIBRARY) 

請讓我知道是否需要任何信息。 謝謝。

+0

你可以發佈你的Android.mk嗎? – Alex

+0

是你的文件* .c或* .cpp? –

+0

@MaxPlakhuta這是一個C文件 – malayaleecoder

回答

0

您可能需要使用一個外部包圍你的代碼「C」塊:

extern "C" { 
    Your JNIEXPORT functions 
} 

對於C和C++,你可以這樣做:

#ifdef __cplusplus 
extern "C" { 
#endif 

    Your JNIEXPORT functions 

#ifdef __cplusplus 
} 
#endif 
+0

感謝您的輸入。不幸的是應用所述的變化不會改變/刪除錯誤:( – malayaleecoder

+0

@malayaleecoder,分享您的android.mk和application.mk文件 –

+0

我Application.mk只是說「APP_ABI:= 86」 – malayaleecoder

0

把代碼來檢索文件中一個try catch塊(或類似的東西)。另外,將代碼指向文件時,請確保您具有以C:開頭的整個目錄(在Windows中)。

相關問題