dlopen(“xxxx”)失败:dlopen失败:未找到库“xxxx”

时间:2015-06-18 08:14:39

标签: java android

package com.test.nativeapp;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends ActionBarActivity {

    static {
        try {
            System.load("native/libkdu_jni.so");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load.\n" + e);
          System.exit(1);
        }
      }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

LogCat错误:

  

06-18 11:13:55.235:D / dalvikvm(17658):试图加载lib   native / libkdu_jni.so 0x421eeb38 06-18 11:13:55.235:E / dalvikvm(17658):   dlopen(“native / libkdu_jni.so”)失败:dlopen失败:库   “native / libkdu_jni.so”未找到

     

06-18 11:13:55.235:W / System.err(17658):本机代码库失败   负荷。

     

06-18 11:13:55.235:W / System.err(17658):   java.lang.UnsatisfiedLinkError:dlopen failed:library   “native / libkdu_jni.so”未找到

我应该把这个文件夹放在哪里?

3 个答案:

答案 0 :(得分:0)

试试这个:

$stmt = $conn -> prepare(" 
        INSERT INTO 
            formestonline 
            (ebelp, cre, cep, aa ) 
        VALUES 
            (?, ?, ?, ?)");
    $stmt -> bind_param("ssss", $ebelp, $cre, $cep, $aa);

    $a_pos = $_POST['pos'];
    $a_cre = $_POST['cre'];
    $a_cep = $_POST['cep'];
    $a_aa  = $_POST['aa'];

    for ($a = 0; $a < count($a_pos); $a++):
        $ebelp  = $a_pos["EBELP"][$a];
        $cre    = $a_cre[$a];
        $cep    = $a_cep[$a];
        $aa     = $a_aa[$a];
        $stmt->execute();

    endfor;

loadLibrary()实际上从ape的lib /加载。你也不需要指定'lib'和amp;扩展名'so'。

希望这会有所帮助。

答案 1 :(得分:0)

我和其他.so文件有同样的问题。 我使用相关文件将jniLibs库添加到...src/main并且它有效。 也许你可以尝试一下。

答案 2 :(得分:0)

使用System.load("…");,您正在以一种构建系统的Android APK打包代码无法检测到的方式加载库。因此,该库未包含在APK中,并且在运行Android设备上的应用程序时无法在运行时找到该库。

要解决此问题,请使用构建系统的机制使APK打包程序知道要包含的其他库。这在构建系统之间会有所不同。例如,在CMake构建系统中,您只需将库添加到target_link_libraries(…)中的库列表中即可:

add_executable(my_executable_name ${SRCS} ${RESOURCES})

# Link all required libraries with the executable, 
# and include them into the Android APK.
target_link_libraries(my_executable_name
    # Name libraries here as you would when calling "g++ -l…".
    # Alternatively, use absolute paths.
    Qt5::Core
    Qt5::Quick
    /my/path/to/native/libkdu_jni.so
)