当前位置: 首页 > 知识库问答 >
问题:

如何将JNI与AAR库一起使用?

梁丘柏
2023-03-14

我正在创建一个Android库(.aar文件),我需要使用JNI。(如果可能的话,我很清楚谷歌不鼓励使用JNI/NDK,但在这种情况下,这是不可能的)。

我从一个独立的hello jni示例应用程序开始(首先学习jni),其中包含以下文件

HelloJni.java

public class HelloJni extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

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

    public native String  stringFromJNI();

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

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

应用程序.mk

APP_ABI := all

你好,jni.c

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

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI!");
}

以下构建良好的应用程序(apk),我能够在我的设备上运行它,它打印“Hello from JNI!”正如预期的那样。

现在,我做了同样的事情,但不是apk,而是建立了一个库项目来生成aar。除了HelloJni,我把所有的文件都保存了。java,我将其更改为:

HelloJni.java

public class HelloJni {
    public native String stringFromJNI();

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

aar构建得很好,但是当我将aar导入到一个单独的应用程序项目中,并尝试在我的设备上运行它时,它在应用程序启动时崩溃,我收到以下错误logcat消息:

com.test.sample。mysampleapplication E/AndroidRuntime﹕ 致命异常:主进程:com.test.sample。mysampleapplication,PID:20047 java.lang.UnsatifiedLinkError:dalvik.system。PathClassLoader[DexPathList[[zip file”/data/app/com.test.sample.mysampleapplication-1/base.apk“],nativellibrarydirectories=[/data/app/com.test.sample.mysampleapplication-1/lib/arm,/vendor/lib,/system/lib]]在java.lang.Runtime.loadLibrary(Runtime.java:366)在java.lang.system.loadLibrary(system.java:988)中找不到“libhello jni.so”。。。

这个“libhello-jni.so”文件到底是什么?我为什么需要它?作为一名apk,我能够很好地完成这项任务。但是,有谁能解释一下,当我把它制作成aar,并导入到应用程序项目中使用它时,为什么它不起作用?我是否遗漏了将其放入库(并使用)所需的其他步骤?谢谢

编辑:

这就是我将aar导入应用程序的方式。1、点击“文件”-

共有2个答案

卞成荫
2023-03-14

您必须使用Android ndk中的ndk build命令构建本机代码。

这个过程将生成linhello jni。因此,这将包括在您的构建中。

姬锐
2023-03-14

结果我不得不在我的构建中添加一些NDK配置。我的AAR模块目录中的gradle文件。

build.gradle:

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"

        // This determines the .so filename
        ndk {
            moduleName "hello-jni"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

没有在内部版本中添加。gradle将生成一个默认为项目名称的.so文件,在我的示例“libaar.so”中。使用上面的配置,生成的.so文件将是“libhello jni.so”。

 类似资料:
  • 我试图在我的codeigniter应用程序中包含甘特图。接下来的教程一是:https://docs.dhtmlx.com/tutorials__connector_codeigniter__step6.html 当我深入研究这个问题并直接点击控制器时,我发现了一个问题: Sub_文件夹是实际的项目文件夹,其中有复制粘贴dhtmlx、dhtmlxGantt和dhtmlxScheduler文件夹。我不

  • 我在Ubuntu 14.04中安装了phpbrew以使用PHP5.4。它工作得很好,但当我尝试使用composer时除外,composer会忽略phpbrew并安装与PHP5.5相关的依赖项。 有没有办法强制composer与phpbrew config兼容?我试图在我的作曲家中添加:php:“5.4”。json,但是它说这个要求在我的php版本中是不可能的。

  • 我是Micronaut框架的新手,我正在尝试使用entitymanager创建我的存储库。我这样创建了我的存储库 我使用这个类实现接口并注入entitymanager 问题是我一直有这个错误: PS:我已经启用了注释处理

  • 我正在尝试将composer与我的WampServer一起使用。 我所有文件的路径都是,但当我运行composer时,它会将供应商文件和其他东西安装到其他地方。 我甚至不知道我的项目在哪里,我也不能改变我的项目在哪里的路径。我已经尝试了所有的方法,但它似乎仍然没有在我的项目文件夹中安装供应商文件。

  • API level 28和Google建议使用registerNetworkCallback(NetworkRequest,PendingIntent)不推荐CONNECTIVITY\u操作。 我尝试使用ConnectionManager注册了registerNetworkCallback。NetworkCallback和它的工作,但我想使用PendingContent。 让我困惑的是公共空寄存器

  • 问题内容: 当我尝试将Webpack与简单的Express服务器一起使用时,总是会收到大量错误消息: express.js 我得到所有这些错误: 这是我的配置文件: 我该怎么办,我还需要在服务器端使用webpack。 我像这样运行express.js文件: 问题答案: 我最终要做的是,我使用了两种不同的配置,一种用于使用webpack将服务器内容打包在一起,另一种用于将所有浏览器内容打包在一起,并