本机方法调用的普通方法调用有什么区别?

时间:2015-06-05 07:34:59

标签: android android-ndk

//my class
class NDKSupport {

    // Loding library
    static {
        System.loadLibrary("NDKTest");
    }

    // Stuff in NDKSupport
    public native String getMessageFromNDK(NDKSupport support);

    public String getMessage() {

        // doing some stuff over here
        return "SOME RESULT";
    }
}

//Native code


 JNIEXPORT jstring JNICALL
 Java_com_afbb_ndkcheck_NDKSupport_getMessageFromNDK(
 JNIEnv* env, jobject thiz, jobject ndkSupport) {

 jclass ndkSupportClz = env->GetObjectClass(ndkSupport);

 jmethodID getInstallationSource =
 env->GetMethodID(ndkSupportClz,"getMessage", "()Ljava/lang/String;");

 return (jstring)env->CallObjectMethod(mainActivity, getInstallationSource);
 }

现在在另一个类中我创建了Object并调用了两个方法,它们都会做同样的事情。这两个呼叫在性能方面还是在另一个方面有什么区别。

NDKSupport support = new NDKSupport();

// what is the difference between these two calls

String d = support.getMessage();
String d2 = support.getMessageFromNDK(support);

给我一​​些有关此内容或任何可用教程的信息。 对不起我的英文..

2 个答案:

答案 0 :(得分:2)

本机方法是特定于平台的代码。它们通常用C或C ++等语言编写,并包含在库(dll)中。可以创建一个受益于此类库的混合Java应用程序。

使用原生方法的原因

  1. 获取对您设备或Android的特殊功能的访问权限 操作系统
  2. 获得额外的速度
  3. 获取对大量现有遗留代码的访问权
  4. 通常,NDK的良好用例是CPU密集型应用程序,如游戏引擎,信号处理和物理模拟

    本机方法的主要缺点是您不具备跨平台功能

    现在,如果您不知道本机代码是什么,那么您可能不需要使用本机代码。 Android NDK文档很好地解释了这一点:

      

    ...,您应该明白NDK不会使大多数应用受益。如   开发人员,您需要平衡其优势与缺点。   值得注意的是,在Android上使用本机代码通常不会导致   显着的性能提升,但它总是会增加您的应用程序   复杂。通常,只有在必要时才应使用NDK   到您的应用程序 - 从不因为您只是喜欢用C / C ++编程。什么时候   考虑是否应该使用本机代码进行开发   关于您的要求,看看Android框架API是否提供   您需要的功能。

答案 1 :(得分:1)

NDK允许您使用C / C ++编写代码,然后将其链接到Java应用程序。您可以提高应用程序的速度。

NDK的缺点是,它只能编译到特定的CPU(而留在Java领域意味着它可以在任何目标版本的Android上运行)。

本地C代码将使用底层操作系统(linux)API(系统调用),因此比通过JVM解释java代码要快得多。大多数游戏使用本机C代码库进行2D / 3d图形,输入,声音等...

所以没有区别,但你可以提高你的代码性能,如果你想为某些特定的cpu编码你可以使用本机方法,但如果你想创建一个兼容所有类型的cpu的应用程序,你可以使用简单的java方法。 您可以根据您的应用要求使用任何方法。 您可以关注一些视频教程here。这是很好的解释和很好的教程。 这里有很多教程 - first second third