最简单的Android JNI开发入门,JNI环境配置
转载请注明出处,谢谢: http://blog.csdn.net/wj2030/article/details/38024249
本文主要讲述在adt-bundle-windows-x86_64-20131030构架Android JNI开发环境以及如何快速开发出一个Hello World程序。
1.确保adt版本在v22以上或更高,低于V22版本为测试。
2.确保已经下载android-ndk-r9d-windows-x86_64。同时版本为R9,或更高版本。低版本未测试。
############下面为配置及开发步骤##########
1.安装cdt8.0以上版本。我的软件之前安装,现在不需要安装。所以不做说明。同时,cdt只是为了在eclipse下方便开发C/C++代码。不是必须的。
2.新建一个Android工程AndroidJNI,然后一路next-->finish.
3.修改默认的layout文件。给TextView添加一个id:
<TextView
android:id="@+id/tv_helloworld"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
4.将鼠标放在AndroidJNI工程上,右击鼠标->Android Tools->Add Native Support:使用默认库名。Finish.
5.此时软件会自动在工程目录下生成jni目录,
其中AndroidJNI.cpp为库文件的源文件。Android.mk为类似于Linux下的Makefile文件,用于指定库文件编译规则。打开AndroidJNI.cpp编辑添加如下源代码:
#include <jni.h>
//使用extern C
extern "C"{
JNIEXPORT jstring JNICALL
Java_com_example_myjni_MainActivity_StringFromC(JNIEnv* env, jobject obj)
{
return env->NewStringUTF("Hello form c");
}
}
这里解释一下各部分代码意义:
a).头文件 <jni.h> 中定义了jni开发下要使用的各种数据结构和方法
b).extern "C" { } 是考虑到C编译器和C++编译器的不同,兼容C/C++代码互相调用的问题。具体可以百度。
c).JNIEXPORT JNICALL 是JNI关键字,表明该函数是用于JNI调用的。
d).jstring 为该函数返回值类型。具体参考jni.h
e).Java_com_example_androidjni_MainActivity_StringFromC 为Java_+包名+类名+函数名。其中均以'_'连接。
f).(JNIEnv* env, jobject obj)为函数传入参数
g).return env->NewStringUTF("HelloWorld Form C Code");为函数操作和返回值
6.编写Java代码调用C库。在MainActivity.java中。如下编写:
package com.example.androidjni;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
//静态代码块加载本地库文件
static{
System.loadLibrary("MyJNI");
}
//声明本地库函数
public native String StringFromC();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv_hello = (TextView) this.findViewById(R.id.tv_helloworld);
tv_hello.setText(StringFromC());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
编译运行,可以在手机上看到如下结果,说明编译成功。