代码之家  ›  专栏  ›  技术社区  ›  Jishant

不同产品风味的NDK支持

  •  7
  • Jishant  · 技术社区  · 8 年前

    我想要 不同的 一串 价值 来自ndk库。 由于我有两种口味的演示和直播,我想要值“你好,我来自演示”的演示口味和直播口味,我想要“你好,我来自直播”

    这是我的java文件代码

    public class MainActivity extends AppCompatActivity {
        // Used to load the 'native-lib' library on application startup.
        static {
            System.loadLibrary("native-lib");
        }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }
    
    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
    

    }

    这是我的cpp文件代码

    #include <jni.h>
    #include <string>
    
    extern "C"
    JNIEXPORT jstring JNICALL
    Java_com_de_demo_ndk2_MainActivity_stringFromJNI(
            JNIEnv *env,
            jobject /* this */) {
        std::string hello = "hello I am from  demo";
        return env->NewStringUTF(hello.c_str());
    }
    

    这是我的身材。gradle文件

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 26
        defaultConfig {
            applicationId "com.de.demo.ndk2"
            minSdkVersion 15
            targetSdkVersion 26
            versionCode 1
            flavorDimensions "default"
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            externalNativeBuild {
                cmake {
                    cppFlags ""
                }
            }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        productFlavors {
    
            demo
                    {
                        // applicationId "com.readwhere.whitelabel.test"
                        //applicationId "com.android.rwstaging"
                        applicationId "com.android.demo"
                        versionName "2.1"
                        dimension "default"
    
                        externalNativeBuild {
                            cmake {
    
                                targets "native-lib-demo","my-executible-                   demo"
    
                            }}
    
    
                    }
            live
                    {
                        // applicationId "com.readwhere.whitelabel.test"
                        //applicationId "com.android.rwstaging"
                        applicationId "com.android.live"
                        versionName "2.1"
                        dimension "default"
    
    
    
                    }}
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
    

    我已经在演示文件夹和主文件夹中粘贴了相同的cpp文件 但可以完成我的任务。任何帮助都将不胜感激 这是一些参考链接

    https://developer.android.com/studio/projects/gradle-external-native-builds.html

    How to set CmakeLists path in product flavor for each Android ABI?

    2 回复  |  直到 8 年前
        1
  •  12
  •   Alex Cohn    8 年前

    可能,在编译时实现目标的最小代码是设置 cppFLags 每种口味:

    productFlavors {
      demo {
        applicationId "com.android.demo"
        versionName "2.1"
        dimension "default"
    
        externalNativeBuild.cmake {
          cppFlags '-DDEMO'
        }
      }
      live {
         applicationId "com.android.live"
         versionName "2.1"
         dimension "default"
        externalNativeBuild.cmake {
          cppFlags '-DLIVE'
        }
      }
    }
    

    清洁石油产品 文件

    #ifdef DEMO
      std::string hello = "hello I am from demo";
    #endif
    #ifdef LIVE
      std::string hello = "hello I am from live";
    #endif
    

    或者你可以使用 stingify 图案如下所示 answer .

    当然,条件编译不限于字符串变化。

        2
  •  1
  •   Jishant    8 年前

    最后我找到了一个解决方案。 这是我的cpp文件代码

    Java_com_de_demo_ndk2_MainActivity_stringFromJNI(
            JNIEnv *env,
            jobject jobject1, jstring jstring1) {
    
        std::string hello;
        const char *nativeString1 = env->GetStringUTFChars( jstring1, 0);
        if (strcmp(nativeString1, "demo") == 0) {
            hello = "Hello from demo C++";
        } else if (strcmp(nativeString1, "live") == 0) {
            hello = "Hello from live C++";
        }
    
        return env->NewStringUTF(hello.c_str());
    }
    

    我从java代码中传递flavor值,这里是我的java文件代码。

    public class MainActivity extends AppCompatActivity {
    
        // Used to load the 'native-lib' library on application startup.
        static {
            System.loadLibrary("native-lib");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Example of a call to a native method
            TextView tv = (TextView) findViewById(R.id.sample_text);
            String value = BuildConfig.FLAVOR;
            String ndkValue = stringFromJNI(value);
            tv.setText(ndkValue);
        }
    
        /**
         * A native method that is implemented by the 'native-lib' native library,
         * which is packaged with this application.
         * @param value
         */
        public native String stringFromJNI(String value);
    }
    

    现在我可以根据所选的口味得到我想要的任何文本。