Android NDK通过应用程序提供库

时间:2017-03-14 09:33:09

标签: android android-ndk

我正在深入研究ndk的东西,我已经成功建立了一个简单的库并从我的活动中调用它。

为了测试它,在我使用的Activity中:

 static {
        System.loadLibrary("my-lib");
    }

    public native static String callNativeFunction(Context context);

这意味着调用MyActivity.callNativeFunction(context)会从我的Cpp函数返回String值。

我有两个问题:

  1. loadLibrary是在我的主要活动中制作的,但我希望能够在活动可能关闭时从callNativeFunction调用IntentService函数或者从我的应用程序的其他地方。如何正确加载库并在应用程序的所有位置提供它?

  2. 由于这是我在项目中使用的一个简单功能,在发布时还有其他特定的功能吗?从https://developer.android.com/studio/projects/add-native-code.html开始,似乎Gradle为所有支持的abis构建并将它们添加到apk中。

1 个答案:

答案 0 :(得分:1)

  1. 您需要加载一次库。这也可以在您的Application课程中完成。加载库后,您可以从cpp
  2. 中定义的相应类调用已定义的本机方法

    申请类:

    public class SRApplication extends Application {
        static {
            System.loadLibrary("my-lib");
        }
    
        @Override
        public void onCreate() {
           super.onCreate();
        }
    }
    

    CPP:

    extern "C"
    jstring
    Java_com_example_service_ExampleService_getNativeString (
        JNIEnv* env,
        jobject /* this */) {
    
        return env->NewStringUTF("yo");
    }
    

    您的服务:

    package com.example.service.ExampleService;
    
    public class ExampleService extends Service {
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            String nativeString = getNativeString();
            return null;
        }
    
        public native String getNativeString();
    
    }
    
    1. 如果您没有针对不同cpu变体的特定代码,则不需要显式处理任何内容,默认

      externalNativeBuild { cmake { cppFlags "" } }

      就足够了。