1、创建工程
1.1、创建TestJni
创建一个JNI的工程与创建一个普通的Android工程并无两样,但是会再添加一个名为jni的目录,如下图所示:
1.2、创建文件
在创建完成TestJni目录之后,需要在该目录下创建一些文件,名为:Android.mk,Application.mk以及我们的C文件hello-jni(这里的C文件笔者直接使用的Android官方给的例子,便于大家查看复制,免得自己敲错了)。
2、配置文件
2.1、Android.mk
该文件在之前有过详细说明,这里不再赘述,我们直接看源码:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
include $(BUILD_SHARED_LIBRARY)
该文件中只有一句代码,我们先来看看:
APP_ABI := all
本行代码的意思是,将C文件编译在运行的各种平台上的so文件。常见平台有arm,arm-v7,x86,mips等。
3、C文件源码
避免大家到处找不到该文件,这里我也直接将C文件贴出来好了:
#include <string.h>
#include <jni.h>
/* This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
*
* apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
*/
jstring
Java_com_example_testjni_MainActivity_stringFromJNI( JNIEnv* env,
jobject thiz )
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#define ABI "armeabi-v7a/NEON"
#else
#define ABI "armeabi-v7a"
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__mips__)
#define ABI "mips"
#else
#define ABI "unknown"
#endif
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");
}
4、Java源码
这里提供一个很简单的JAVA调用程序:
package com.example.testjni;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
static {
System.loadLibrary("hello-jni");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
TextView tv = new TextView(this);
tv.setText( stringFromJNI() );
setContentView(tv);
}
public native String stringFromJNI();
public native String unimplementedStringFromJNI();
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
5、执行程序
如何执行程序,请大家参照之前的博文中如何搭建NDK开发环境中的文章:http://blog.csdn.net/ljtyzhr/article/details/39957187
如果程序正确无误,那么大家应该在控制台看大如下所示的提示信息,就表示程序配置成功了: