我正在创建一个Android库(.aar文件),我需要使用JNI。 (我非常清楚Google在可能的情况下不鼓励使用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");
}
}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
Application.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)很好,我可以在我的设备上运行它,打印&#34;来自JNI的你好!&#34;如预期的那样。
现在,我做了同样的事情,但是我没有使用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:FATAL EXCEPTION: 主要 过程:com.test.sample.mysampleapplication,PID:20047 java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader [DexPathList [[zip file] &#34; /data/app/com.test.sample.mysampleapplication-1/base.apk"],nativeLibraryDirectories = [/数据/应用/ com.test.sample.mysampleapplication-1 / LIB /臂, / vendor / lib,/ system / lib]]]无法找到&#34; libhello-jni.so&#34; 在java.lang.Runtime.loadLibrary(Runtime.java:366) 在java.lang.System.loadLibrary(System.java:988)...
这个世界是什么&#34; libhello-jni.so&#34;文件?为什么我需要它?我能够像apk一样完美地运行。但有人可以解释为什么当我把它变成aar时它不起作用,并将它导入到app项目中使用它?我是否缺少将其纳入库(并使用它)所需的一些额外步骤?谢谢!
修改
这是我将我的aar导入我的应用程序的方式。 1.单击&#34;文件&#34; - &GT; &#34;新&#34; - &GT; &#34;新模块&#34;。 2.选择&#34;导入.JAR或.AAR包&#34;作为模块类型。 3.将我的aar文件设置为新模块 4.然后打开&#34; File&#34; - &GT; &#34;项目结构&#34; 5.在&#34;依赖&#34;选项卡,添加&#34;模块依赖&#34;并选择我的aar文件 如果这不是将aar导入我的应用程序的好方法,那么也请告诉我。谢谢!
答案 0 :(得分:3)
原来我必须在我的AAR模块目录中的build.gradle文件中添加一些NDK配置。
<强>的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'
}
}
}
没有在build.gradle中添加的文件将生成一个默认为项目名称的.so文件,在我的例子中为“libsample-aar.so”。使用上面的配置,生成的.so文件将是“libhello-jni.so”。
答案 1 :(得分:0)
您必须使用Android NDK中的命令ndk-build构建本机代码。
此过程将生成将包含在您的构建中的linhello-jni.so。