gpt4 book ai didi

java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:16 26 4
gpt4 key购买 nike

文件夹结构

 app 
---main
---java
----jni
-----Android.mk
-----Application.mk
----- hello-jni.c
---res

在 build.gradle 中

apply plugin: 'com.android.application'

android {
compileSdkVersion 21
buildToolsVersion "22.0.1"

defaultConfig {
applicationId "com.example.hellojni"
minSdkVersion 17
targetSdkVersion 21
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src/main/libs'

}

ndk {
moduleName "hello-jni"
cFlags "-std=c++11 -fexceptions"
ldLibs "log"
stl "gnustl_shared"
abiFilter "armeabi-v7a"
}

task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
extension 'jar'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}

tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}







testApplicationId "com.example.hellojni.tests"
testInstrumentationRunner "android.test.InstrumentationTestRunner"
}


buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}

dependencies {
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
}


}

在 Android.mk 中

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

在 hello-jni.c 中

include<com.example.hellojni.HelloJni.h>

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



jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a/NEON (hard-float)"
#else
#define ABI "armeabi-v7a/NEON"
#endif
#else
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a (hard-float)"
#else
#define ABI "armeabi-v7a"
#endif
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__x86_64__)
#define ABI "x86_64"
#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */
#define ABI "mips64"
#elif defined(__mips__)
#define ABI "mips"
#elif defined(__aarch64__)
#define ABI "arm64-v8a"
#else
#define ABI "unknown"
#endif

return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");
}

在Java中

  public class HelloJni extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);


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


public native String stringFromJNI();


public native String unimplementedStringFromJNI();


static {
System.loadLibrary("hello-jni");
}
}

我遇到了不满意的错误

 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.hellojni-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libhello-jni.so"
at java.lang.Runtime.loadLibrary(Runtime.java:366)
at java.lang.System.loadLibrary(System.java:989)
at com.example.hellojni.HelloJni.<clinit>(HelloJni.java:64)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.Class.newInstance(Class.java:1572)
at android.app.Instrumentation.newActivity(Instrumentation.java:1088)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
at android.app.ActivityThread.access$800(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
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:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

我的 local.properties

sdk.dir=F\:\\SDK
ndk.dir=C\:\\NDK

它不生成 .so 文件..

最佳答案

你的 build.gradle 中有几个错误:

nativeLibsToJar 任务是 gradle android 插件早期版本中的相关技术,至少从 0.7 开始不应使用它,它可能会导致错误,请删除此任务。相反,如果您将 .so 文件放入 jniLibs/ABI 目录(其中 ABI 是 armeabi-v7a、x86...),它们将正确集成到您的 APK 中。

那么,你已经设置:

jni.srcDirs = []
jniLibs.srcDir 'src/main/libs'

它从 gradle 插件中停用内置的 ndk 集成,并使 gradle 使用来自 libs 而不是来自 jniLibs 的库。没关系,但稍后您将使用 ndk {} block 定义您的 ndk 模块,然后将其删除。

清理完这些部分后,您可以从命令行调用 ndk-build(或 ndk-build.cmd,如果您使用的是 Windows),从你的 Android 项目的根目录。它将在 libs/ABI 中生成您的 .so 文件,并且它们将集成到您的 APK 中,因为 jniLibs.srcDir 'src/main/libs' 告诉 gradle 获取这些库来自 libs

您可以通过将 APK 作为 zip 文件打开来检查您的 .so 文件是否已集成;您的 .so 文件必须位于 lib/ABI 下。

关于java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30295180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com