bae*_*aek 7 java-native-interface android android-ndk aar
我正在创建一个Android库(.aar文件),我需要使用JNI.(我非常清楚谷歌如果可能的话,不鼓励使用JNI/NDK,但在这种情况下,这是不可能的).
我从一个独立的hello-jni示例APP(首先学习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");
}
}
Run Code Online (Sandbox Code Playgroud)
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
Application.mk
APP_ABI := all
Run Code Online (Sandbox Code Playgroud)
你好,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!");
}
Run Code Online (Sandbox Code Playgroud)
以下构建精美的应用程序(apk),我能够在我的设备上运行它,打印"来自JNI的Hello!" 正如所料.
现在,我做了同样的事情,但我没有使用apk,而是建立了一个库项目来生产aar.我保留了除HelloJni.java之外的所有文件,我将其更改为以下内容:
HelloJni.java
public class HelloJni {
public native String stringFromJNI();
static {
System.loadLibrary("hello-jni");
}
}
Run Code Online (Sandbox Code Playgroud)
aar构建正常,但是当我将aar导入一个单独的应用程序项目,并尝试在我的设备上运行它时,它在应用程序启动时崩溃,我收到以下错误logcat消息:
com.test.sample.mysampleapplication E/AndroidRuntime:FATAL EXCEPTION:main进程:com.test.sample.mysampleapplication,PID:20047 java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader [DexPathList [[zip file"/ data/app /com.test.sample.mysampleapplication-1/base.apk"],nativeLibraryDirectories=[/data/app/com.test.sample.mysampleapplication-1/lib/arm,/ vendor/lib,/ system/lib]] ]在java.lang.System.loadLibrary(System.java:988)的java.lang.Runtime.loadLibrary(Runtime.java:366)找不到"libhello-jni.so"...
这个"libhello-jni.so"文件在世界上是什么?为什么我需要它?我能够像apk一样完美地运行.但有人可以解释为什么当我把它变成aar时它不起作用,并将它导入到app项目中使用它?我是否缺少将其纳入库(并使用它)所需的一些额外步骤?谢谢!
编辑:
这就是我将aar导入我的应用程序的方式.1.单击"文件" - >"新建" - >"新模块".2.选择"导入.JAR或.AAR包"作为模块类型.3.将我的aar文件设置为新模块4.然后打开"文件" - >"项目结构"5.在"依赖关系"选项卡中,添加"模块依赖关系"并选择我的aar文件如果这不是一个好的导入方式我的应用程序,然后也请让我知道.谢谢!
结果我不得不在我的 AAR 模块目录中的 build.gradle 文件中添加一些 NDK 配置。
构建.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'
}
}
}
Run Code Online (Sandbox Code Playgroud)
没有在 build.gradle 中添加它会生成一个 .so 文件,该文件默认为您的项目名称,在我的情况下为“libsample-aar.so”。使用上面的配置,生成的 .so 文件将是“libhello-jni.so”。
| 归档时间: |
|
| 查看次数: |
6250 次 |
| 最近记录: |