2016-07-14 3 views
0

У меня есть проект, который использует Android NDK для доступа к датчику акселерометра моего устройства. Приложение работает, за исключением случаев, когда я пытаюсь использовать ASensor_getReportingMode() или ASensor_isWakeUpSensor(), так как он не находит символы. Вероятно, это происходит и с другими функциями. Странно есть функции одного и того же заголовочного файла, такие как ASensor_getName() или ASensor_getVendor(), которые работают без проблем. Кто-нибудь знает, чего здесь не хватает?Android NDK dlopen не удалось: не удалось найти символ «ASensor_getReportingMode», на который ссылается «lib * .so»

build.gradle (модуль)

apply plugin: 'com.android.model.application' 

model { 
    android { 
     compileSdkVersion 24 
     buildToolsVersion "24.0.0" 

     defaultConfig { 
      applicationId "com.apidae.sensorndk" 
      minSdkVersion.apiLevel 19 
      targetSdkVersion.apiLevel 24 
      versionCode 1 
      versionName "1.0" 
     } 
     buildTypes { 
      release { 
       minifyEnabled false 
       proguardFiles.add(file('proguard-rules.pro')) 
      } 
     } 
     ndk { 
      moduleName "ndkfeatures" 
      ldLibs.addAll([ 'android', 'log']) 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:24.0.0' 
} 

Java Class

package com.apidae.sensorndk; 

public class NdkFeatures { 
    static { 
     System.loadLibrary("ndkfeatures"); 
    } 
    public native boolean init(); 
} 

C++ Источник сегмент

#include <android/sensor.h> 
... 
    Log::info("Sensor Info:\n Name:\t%s\n Vendor:\t%s\n Mode:\t%d", 
     ASensor_getName(mAccelerometer), 
     ASensor_getVendor(mAccelerometer), 
     ASensor_getReportingMode(mAccelerometer)); // <- Taking this line out runs 
... 

build.gradle (App)

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle-experimental:0.7.2' 
     classpath 'com.android.tools.build:gradle:2.1.2' 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

Полное исключение:

E/AndroidRuntime: FATAL EXCEPTION: main 
     Process: com.apidae.sensorndk, PID: 6855 
     java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "ASensor_getReportingMode" referenced by "libndkfeatures.so"... 
      at java.lang.Runtime.loadLibrary(Runtime.java:371) 
      at java.lang.System.loadLibrary(System.java:553) 
      at com.apidae.sensorndk.NdkFeatures.<clinit>(NdkFeatures.java:6) 
      at com.apidae.sensorndk.MainActivity.onCreate(MainActivity.java:13) 
      at android.app.Activity.performCreate(Activity.java:5264) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
      at android.os.Handler.dispatchMessage(Handler.java:110) 
      at android.os.Looper.loop(Looper.java:193) 
      at android.app.ActivityThread.main(ActivityThread.java:5299) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641) 
      at dalvik.system.NativeStart.main(Native Method) 

ответ

1

Я понял это, в конце концов. Это происходит потому, что целевой SDK android-24, который я использовал для компиляции, не соответствовал android-19 на моем устройстве. Используя правильный целевой SDK, во время компиляции я могу видеть, что функции, которые я пытаюсь использовать, не поддерживаются

https://stackoverflow.com/a/27338365/6578619