第一讲 使用JNI输出“Hello World!”

来源:互联网 发布:iphone6s壁纸软件推荐 编辑:程序博客网 时间:2024/05/22 03:13

一、介绍:

Java Native Interface(JNI)标准是Java平台的一部分,允许Java语言和其他语言进行交互。JNI是本地编程接口,它使得在Java虚拟机内部运行的Java代码能够与用其他语言,如C,C++和汇编语言编写的程序和库进行交互操作。

二、步骤:

1)使用Android Studio新建一个工程:JniHello

2)在src\main\java文件夹下新建Java类:JniUtils.java,并创建一个Native方法:

publicclass JniUtils{

      public static native StringgetStringFromC()

}

3)然后点击“Build”菜单下的“Clean Project”然后点击“Make Project”,运行完之后在“app\build\imtermediates”该目录下会生成“classes”文件夹,没有生成请重新操作。如图:


4)打开Android Studio的Terminal控制台,输入指令:

“cdapp\build\imtermediates\classes\debug”进入项目对应的目录下

然后输入:

“javah -jni com.example.lenovo.jnihello”(刚才创建的Java类的完整路径)

如果报javah不是内部命令的话需要检查JDK环境变量是否配置正确,或者JDK的版本和Android Studio启动的版本是否一致(64或者32位)。

5)这时候打开“debug”文件夹下会多出一个“.h”文件,然后在 “src\main”文件夹下新建“jni”目录,将“debug”文件夹下的“.h”文件复制进去,如图:


然后新建一个C类文件,添加如下代码:

若使用C进行编写:

#include"com_example_lenovo_jnihello_JniUtils.h"

/*Header for class com_example_lenovo_jnihello_JniUtils */

/*

 * Class:    com_example_lenovo_jnihello_JniUtils

 * Method:   getStringFromC

 * Signature: ()Ljava/lang/String;

 */

JNIEXPORTjstring JNICALL Java_com_example_lenovo_jnihello_JniUtils_getStringFromC

 (JNIEnv *env, jstring str){

  return(*env)->NewStringUTF(env,"hello android developers");

 };

若使用C++进行编写:

#include"com_example_lenovo_jnihello_JniUtils.h"

/*Header for class com_example_lenovo_jnihello_JniUtils */

/*

 * Class:    com_example_lenovo_jnihello_JniUtils

 * Method:   getStringFromC

 * Signature: ()Ljava/lang/String;

 */

JNIEXPORTjstring JNICALL Java_com_example_lenovo_jnihello_JniUtils_getStringFromC

       (JNIEnv *env, jstring str){

   return env->NewStringUTF("helloandroid developers");

};

 

 

如果发现新建的C类文件的头文件“#include<jni.h>”那么是因为没有配置NDK的环境;

6)在“gradle.properties”文件末尾添加“android.useDeprecatedNdk=true”,否则会报出“Error:Yourproject contains C++ files but it is not using a supported native system”的错误,然后在app下的“build.gradle”文件内的defaultConfig内添加:

ndk{

           moduleName "jniTest"

           abiFilters "armeabi","armeabi-v7a", "x86"

       }

并重新编译;

7)在刚才创建的java类(JniUtils.java)中添加以下代码:

static{

       System.loadLibrary("jniTest");

}

8)在MainActivity中添加如下代码:

@Override

   protected void onCreate(BundlesavedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

       TextView textView = (TextView)findViewById(R.id.textview);

       textView.setText(JniUtils.getStringFromC());

}

运行结果如下:


0 0
原创粉丝点击