How to load JNI Library (.so files) during Roboletric test?

406 views
Skip to first unread message

jiang vigossjjj

unread,
Mar 18, 2015, 6:44:16 AM3/18/15
to robol...@googlegroups.com, jiangy...@58.com

Hello,
My test ENV: Android Studio 1.1.0、gradle 1.1.0、roboletric gradle plugin 2.4

My TestScript:

@Config(emulateSdk = 18, application= WubaHybridApplication.class)
@RunWith(CustomRobolectricRunner.class)
public class LaunchActivityTest {

    @Test
    public void testone() throws Exception {
        Activity activity = Robolectric.setupActivity(LaunchActivity.class);
        ShadowActivity sa = Robolectric.shadowOf(activity);
        System.out.println(activity.getClass().getName().toString());
        Assert.assertNotNull(activity);
        Assert.assertNotNull(sa);
        Intent intent = sa.peekNextStartedActivity();
        Assert.assertNotNull(intent);
    }

My CustomRobolectricRunner

public class CustomRobolectricRunner extends RobolectricTestRunner{
    public CustomRobolectricRunner(Class<?> testClass)
            throws InitializationError {
        super(testClass);
        String buildVariant = (BuildConfig.FLAVOR.equals("")? "" : BuildConfig.FLAVOR+ "/") + BuildConfig.BUILD_TYPE;
        String intermediatesPath = BuildConfig.class.getResource("")
                .toString().replace("file:", "");
        intermediatesPath = intermediatesPath
                .substring(0, intermediatesPath.indexOf("/classes"));

        System.setProperty("android.package",
                BuildConfig.APPLICATION_ID);
        System.setProperty("android.manifest",
                intermediatesPath + "/manifests/full/"
                        + buildVariant + "/AndroidManifest.xml");
        System.setProperty("android.resources",
                intermediatesPath + "/res/" + buildVariant);
        System.setProperty("android.assets",
                intermediatesPath + "/assets/" + buildVariant);
        System.loadLibrary("libBaiduMapSDK_v3_1_0");
        System.loadLibrary("libcom_wuba_aes_ExecV3_1_0");
        System.loadLibrary("libIvw35");
        System.loadLibrary("liblocSDK4");
        System.loadLibrary("libmsc");
        System.loadLibrary("libUninstallObserverUtil");
    }
}

Getting the following exception:

java.lang.UnsatisfiedLinkError: no libBaiduMapSDK_v3_1_0 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
    at java.lang.Runtime.loadLibrary0(Runtime.java:849)
    at java.lang.System.loadLibrary(System.java:1088)
    at com.robotest.runner.CustomRobolectricRunner.<init>(CustomRobolectricRunner.java:31)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:41)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Reply all
Reply to author
Forward
0 new messages