我遇到了与此问题类似的问题:
在Mac OS X上使用sqlite4java Jar出现UnsatisfiedLinkError
但是,我在Mac上运行,并且我的lib文件夹中有相关的库。但是,如果按原样运行,则会收到UnsatisfiedLinkError。如果运行“ java -jar sqlite4java.jar -d”,则会得到以下输出:
sqlite4java 282
130321:222850.424 FINE [sqlite] Internal: loading library
130321:222850.425 FINE [sqlite] Internal: java.library.path=/Users/mikey/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
130321:222850.425 FINE [sqlite] Internal: sqlite4java.library.path=null
130321:222850.425 FINE [sqlite] Internal: cwd=/Users/mikey/NetBeansProjects/Test/lib/.
130321:222850.425 FINE [sqlite] Internal: default path=/Users/mikey/NetBeansProjects/Test/lib
130321:222850.425 FINE [sqlite] Internal: forced path=null
130321:222850.426 FINE [sqlite] Internal: os.name=mac os x; os=osx
130321:222850.426 FINE [sqlite] Internal: os.arch=x86_64
130321:222850.426 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64
130321:222850.427 FINE [sqlite] Internal: cannot load sqlite4java-osx-x86_64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 in java.library.path
130321:222850.427 FINE …Run Code Online (Sandbox Code Playgroud) 我在本机方法中得到了不满意的链接错误
Logcat主要异常
UnsatisfiedLinkError: Native method not found: rg.sqlite.database.sqlite.SQLiteConnection.nativeHasCodec:()Z
Run Code Online (Sandbox Code Playgroud)
完整的Logcat
02-04 16:29:12.807: E/AndroidRuntime(5087): FATAL EXCEPTION: main
02-04 16:29:12.807: E/AndroidRuntime(5087): java.lang.UnsatisfiedLinkError: Native method not found: org.sqlite.database.sqlite.SQLiteConnection.nativeHasCodec:()Z
02-04 16:29:12.807: E/AndroidRuntime(5087): at org.sqlite.database.sqlite.SQLiteConnection.nativeHasCodec(Native Method)
02-04 16:29:12.807: E/AndroidRuntime(5087): at org.sqlite.database.sqlite.SQLiteConnection.hasCodec(SQLiteConnection.java:160)
02-04 16:29:12.807: E/AndroidRuntime(5087): at org.sqlite.database.sqlite.SQLiteDatabase.hasCodec(SQLiteDatabase.java:2195)
02-04 16:29:12.807: E/AndroidRuntime(5087): at org.sqlite.database.sqlite.SQLiteConnectionPool.setMaxConnectionPoolSizeLocked(SQLiteConnectionPool.java:952)
02-04 16:29:12.807: E/AndroidRuntime(5087): at org.sqlite.database.sqlite.SQLiteConnectionPool.<init>(SQLiteConnectionPool.java:153)
02-04 16:29:12.807: E/AndroidRuntime(5087): at org.sqlite.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:179)
02-04 16:29:12.807: E/AndroidRuntime(5087): at org.sqlite.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
02-04 16:29:12.807: E/AndroidRuntime(5087): at org.sqlite.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
02-04 16:29:12.807: E/AndroidRuntime(5087): at org.sqlite.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
02-04 16:29:12.807: E/AndroidRuntime(5087): at org.sqlite.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
02-04 16:29:12.807: E/AndroidRuntime(5087): at com.example.samplesqlitedb.SearchDataDB.getAutoSuggestion(SearchDataDB.java:33) …Run Code Online (Sandbox Code Playgroud) c++ java-native-interface android unsatisfiedlinkerror android-sqlite
.h文件
#include <jni.h>
#include "NativePackage_HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_NativePackage_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) {
printf("Hello world!\n");
return;
}
Run Code Online (Sandbox Code Playgroud)
爪哇
package NativePackage;
public class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
Run Code Online (Sandbox Code Playgroud)
.c文件
#include <jni.h>
#include "NativePackage_HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_NativePackage_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){
printf("Hello world!\n");
return;
}
Run Code Online (Sandbox Code Playgroud)
我已经使用编译了.c文件
gcc -I /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/include/ -I /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/include/darwin/ -fPIC -o hello -c HelloWorldImp.c
Run Code Online (Sandbox Code Playgroud)
但是,尝试使用运行会java NativePackage/HelloWorld产生以下错误:
java -Djava.library.path=NativePackage/ NativePackage/HelloWorld …Run Code Online (Sandbox Code Playgroud) 错误日志:
03-25 09:46:59.022: I/com.dropbox.sync.android.CoreAccountManager(2217): Prepared cache dir '/data/data/com.company.testapp/app_DropboxSyncCache/my-dropxbox-key'.
03-25 09:46:59.022: W/dalvikvm(2217): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/dropbox/sync/android/NativeHttp;
03-25 09:46:59.022: W/dalvikvm(2217): Exception Ljava/lang/ExceptionInInitializerError; thrown while initializing Lcom/dropbox/sync/android/NativeLib;
03-25 09:46:59.034: D/Updater(2217): java.lang.ExceptionInInitializerError
03-25 09:46:59.034: D/Updater(2217): at com.dropbox.sync.android.CoreAccountManager.initNativeLib(CoreAccountManager.java:107)
03-25 09:46:59.034: D/Updater(2217): at com.dropbox.sync.android.CoreAccountManager.<init>(CoreAccountManager.java:87)
03-25 09:46:59.034: D/Updater(2217): at com.dropbox.sync.android.DbxAccountManager.getInstance(DbxAccountManager.java:112)
03-25 09:46:59.034: D/Updater(2217): at com.dropbox.sync.android.DbxAccountManager.getInstance(DbxAccountManager.java:99)
03-25 09:46:59.034: D/Updater(2217): at com.company.testapp.ui.LoginActivity.notificationPosted(LoginActivity.java:1100)
03-25 09:46:59.034: D/Updater(2217): at com.company.testapp.io.NotificationCenter.postNotification(NotificationCenter.java:79)
03-25 09:46:59.034: D/Updater(2217): at com.company.testapp.io.Updater.processFinishedOperation(Updater.java:4044)
03-25 09:46:59.034: D/Updater(2217): at com.company.testapp.io.Updater.operationSuccess(Updater.java:3115)
03-25 09:46:59.034: D/Updater(2217): at com.company.testapp.io.Updater.access$5(Updater.java:3046)
03-25 09:46:59.034: D/Updater(2217): at com.company.testapp.io.Updater$1.run(Updater.java:2999) …Run Code Online (Sandbox Code Playgroud) 我的应用程序的目标是在Android 6上运行,根据我的理解,它不允许加载共享库.
有没有人遇到过这个问题并且能够成功解决它?
java.lang.UnsatisfiedLinkError:dlopen失败:/data/app/com.XXX.XXX-2/lib/arm/libiconv.so:有文本重定位
android shared-libraries unsatisfiedlinkerror android-6.0-marshmallow
我创建了一个非常小的应用程序,只显示"Hello World".主要活动调用加载SQLCipher库.
package companydomain.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import net.sqlcipher.database.SQLiteDatabase;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SQLiteDatabase.loadLibs(this); // loading the SQLCipher libraries
}
}
Run Code Online (Sandbox Code Playgroud)
build.gradle(module:app)是:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion '25.0.0'
defaultConfig {
minSdkVersion 16
targetSdkVersion 25
}
return void
}
dependencies {
compile 'com.android.support:appcompat-v7:25.0.1'
compile 'net.zetetic:android-database-sqlcipher:3.5.4@aar'
}
Run Code Online (Sandbox Code Playgroud)
此应用程序按预期工作.
但是,当我将Crashlytics添加到build.gradle时:
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
}
apply plugin: 'com.android.application' …Run Code Online (Sandbox Code Playgroud) 我在处理Mat时遵循了所有步骤,包括在调用时将其添加到AsyncTask但仍然是相同的错误,这是找不到本机方法org.opencv.core.mat.n_mat
这是代码:
package com.example.myfirstapp;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import org.json.JSONException;
import org.json.JSONObject;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import com.example.myfirstapp.RegisterMarkerMain.ProcessImage;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.util.Base64;
import android.util.Log;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter; …Run Code Online (Sandbox Code Playgroud) 好吧,我基本上继承了一堆我被告知要修复的代码,因为它几个月前曾经可以工作,但现在不行。程序本身似乎充满了链接错误,我能够修复其中的一些错误。但是,我遇到了 LNK2019 未解决的外部 _ imp 错误,其中 main 中使用的某些功能未解决。由于“ _imp”,我假设这是与从 .dll 或 .lib 文件导入相关的问题。
首先,我有三个 .lib 文件,我相信它们可以正确地将它们导入到 VS2010 中,并且我已将平台配置为 64x。还有与 .lib 文件对应的 .dll 文件。包含这些错误缠身函数声明的 .h 文件包含类似
ILAPI void ILAPIENTRY ilDeleteImage(const ILuint Num);
Run Code Online (Sandbox Code Playgroud)
不幸的是,我猜测该定义是在 .dll 文件中定义的,该文件不是我自己写的,所以我不确定。但由于这是在我之前工作的代码,我相信我收到此错误是因为链接器找不到定义而不是 def/decl 不匹配的原因。
当我将鼠标悬停在 ILAPI 上时,它指出:“ILAPI __declspec(dllimport)” 我目前的猜测是程序导入了 .lib 文件,而 .lib 文件使用 .dll 文件来获取函数的定义。我相信我正在导入 .lib 文件,因为编译器不再一直告诉我它找不到特定的 .lib 文件。但是我担心它可能没有连接 .dll 文件。我有些不确定。我已经打开了 .lib 文件,并且 .lib 文件包含给出错误的函数的名称。我还使用了 Dependency walker 程序来查看我的 DLL 文件,它给了我以下一些错误:
错误:由于隐式依赖模块中缺少导出函数,至少有一个模块具有未解析的导入。
错误:找到具有不同 CPU 类型的模块。
根据其他人的评论,我觉得我可以忽略第二个错误。但我不确定第一个错误。我也不确定这是否是问题的根本原因。它可能是也可能不是。
我还使用 VS cmd 和依赖项walker 查看了 .lib 文件的内部,似乎找不到的函数的名称列在 .lib 和 .dll 之一中。
在配置方面,我在发布模式 x64 …
我正在尝试运行一个简单的JNI示例,其中我运行一个通过动态库调用c ++函数的java应用程序.
我将发布我使用的以下代码和终端命令.
的.java
public class Lab{
public native void hello();
static {
System.loadLibrary("hello");
}
public static void main(String args[]) {
new Lab().hello();
}
}
Run Code Online (Sandbox Code Playgroud)
通过终端获取.class和头文件
javac Lab.java
javah -jni Lab
Run Code Online (Sandbox Code Playgroud)
hello.cpp文件
#include "Lab.h"
#include <stdio.h>
#include <iostream>
JNIEXPORT void JNICALL Java_Lab_hello(JNIEnv *env,jobject jobj) {
cout<<"Hello World"<<endl;
}
Run Code Online (Sandbox Code Playgroud)
生成lib文件"hello.so":
gcc -shared -fpic -o hello.so -I/usr/lib/jvm/jdk1.8.0_45/include -I/usr/lib/jvm/jdk1.8.0_45/include/linux hello.cpp
Run Code Online (Sandbox Code Playgroud)
最后运行文件:
java -Djava.library.path=. Lab
Run Code Online (Sandbox Code Playgroud)
然后我得到错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at Lab.<clinit>(Lab.java:6)
Run Code Online (Sandbox Code Playgroud)
我知道还有其他帖子有同样的问题,但不幸的是,这些解决方案都没有对我有用.我已经尝试过这样的事情: …
我使用 NDK 在 C 中的文件如下,我查看了 Kotlin 中的包名称和 C 类 (NDK) 中的包名称,没有发现任何区别:
jstring Java_com_test1_app1_ui_BaseActivity_getLocalKeyOld(JNIEnv* env, jobject obj, jstring id) {
const char *nativeString = (*env)->GetStringUTFChars(env, id, 0);
char* deviceIdEncode = base64encode(nativeString);
int lenght = strlen(deviceIdEncode);
jstring result;
if(lenght < 16) {
result = (*env)->NewStringUTF(env,"+-0wef2ccfeqa0-+");
} else if(lenght > 16) {
char subbuff[17];
memcpy( subbuff, &deviceIdEncode[0], 16 );
subbuff[16] = '\0';
result = (*env)->NewStringUTF(env,subbuff);
} else {
result = (*env)->NewStringUTF(env,deviceIdEncode);
}
return result;
}
jstring Java_com_test1_app1_ui_BaseActivity_getLocalKey(JNIEnv* env, jobject obj, jstring id) { …Run Code Online (Sandbox Code Playgroud)