NDK:如何在AndroidStudio中包含* .so文件

时间:2015-10-16 07:26:36

标签: android android-studio android-ndk

我有libs jar和* .so。我在教程中创建了Eclipse项目(对于这个库)。我现在在Android Studio中做项目,但系统找不到* .so文件。我在这里做了 - Include .so library in apk in android studio。我的应用程序在这样的库中找不到功能。怎么找到他们? 经度:

10-16 12:16:55.965: W/dalvikvm(4386): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/atol/drivers/fptr/IFptrNative;
10-16 12:16:55.965: W/dalvikvm(4386): threadid=1: thread exiting with uncaught exception (group=0x41869438)
10-16 12:16:55.976: E/AndroidRuntime(4386): FATAL EXCEPTION: main
10-16 12:16:55.976: E/AndroidRuntime(4386): java.lang.ExceptionInInitializerError

使用JAR库创建对象时发生错误。她反过来戳了* .so文件,但找到了她需要的东西。谁应该责备谁该做什么?

4 个答案:

答案 0 :(得分:5)

三个选项:

<强>一

libs文件夹中复制你的* .SO库,并将其放在Build.gradle上:

dependencies
        {
    compile fileTree(include: ['*.jar'], dir: 'libs')
}

<强>两个

src/main/jniLibs上创建一个新文件夹并将其写在Build.gradle

android {
    //Another code 
    sourceSets {
        main {         
            jniLibs.srcDirs = ['src/main/jnilibs']          
        }
        //Another code 
    }//sourceSets tag close
}//Android tag close

<强>有信息

src/main/jniLibs上创建一个新文件夹并将其写在Build.gradle

//Another code....

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


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

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

答案 1 :(得分:3)

当前解决方案

创建文件夹project / app / src / main / jniLibs,然后将* .so文件放在该位置的abi文件夹中。如,

project/
├──libs/
|  └── *.jar       <-- if your library has jar files, they go here
├──src/
   └── main/
       ├── AndroidManifest.xml
       ├── java/
       └── jniLibs/ 
           ├── arm64-v8a/                       <-- ARM 64bit
           │   └── yourlib.so
           ├── armeabi-v7a/                     <-- ARM 32bit
           │   └── yourlib.so
           └── x86/                             <-- Intel 32bit
               └── yourlib.so

已弃用的解决方案

将模块gradle.build文件中的两个代码段添加为依赖项:

compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
How to create this custom jar:

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

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

答案 2 :(得分:0)

您需要将.so文件放在名为lib的文件夹中(它不是libs,应该是lib)。它应该与APK文件中的结构相同。

结构

int lower = 0; 
int upper = sizeof(dataSetForSort) - 1;
int middle = (lower + upper)/2;
string Temp[sizeof(dataSetForSort)];


int i = lower, j = middle + 1 , k = lower;

while(i <= middle && j <= upper)
{
    if( dataSetForSort[i] < dataSetForSort[j] )
    {
        Temp[k].assign(dataSetForSort[i]);
        i++;
    }
    else
    {
        Temp[k].assign(dataSetForSort[j]);
        j++;
    }
    k++;
}
if(i > middle )
{
    for(int h = j ;h <= upper ; h++ )
    {
        Temp[k].assign(dataSetForSort[h]);
        k++;
    }
}
else
    for(int h = i; h<= middle ; h++ )
    {
        Temp[k].assign(dataSetForSort[h]);
        k++;
    }
    for(int i = lower; i <= upper ; i++)
    {
       dataSetForSort[i].assign(Temp[i]);
    }

然后是一个armeabi文件夹,其中插入所有Project: |--lib: |--|--armeabi: |--|--|--.so files. 个文件。然后将文件夹压缩为.zip。将.zip文件重命名为armeabi.jar并添加该行 .so  进入gradle的构建文件中的compile fileTree(dir: 'libs', include: '*.jar')

有关详细信息和替代方法,请参阅This answerThis answer

答案 3 :(得分:0)

创建文件夹名称&#34; jniLibs&#34;在src / main文件夹中添加包含&#34; *的所有文件夹。所以&#34;文件并同步并运行您的应用程序。无需其他步骤。