在前面的博客中介绍了在Android下使用jni,博客中介绍的方法比较麻烦,这篇博客介绍的方法会简单一点,并且会介绍一些技巧
第一步:使用eclipse创建一个Android工程,我就工程的名字命名为Hellojni1
第二步:修改activity_main.xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用c语言的本地方法"
android:onClick="click"/>
</RelativeLayout>
第三步: 修改MainActivity.java中的代码
package com.example.hellojni1;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
static {
//加载打包完毕的so类库
System.loadLibrary("hello");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View view) {
//使用吐司对话框显示c语言代码中的函数helloC的返回值
Toast.makeText(this, helloC(), Toast.LENGTH_SHORT).show();
}
//定义一个本地方法,方法体由c语言实现
public native String helloC();
}
第四步: 展开MainActivity.java文件
第五步:选择Window
第六步:选择Preferences
第七步:选择Android——选择NDK
第八步:设置NDK的路径为为NDK的存放路径,设置完成后单击OK
第九步:选中创建好的Android工程——单击鼠标右键——选择Android Tools——Add Native Support
第十步:设置类库的名称为hello(其实就是生成的so文件的文件名)
第十一步:选中MainActivity,并且单击鼠标右键,选择Copy Qualified Name,此时将MainActivity的完整的包名加类名复制到了剪贴板上
第十二步:打开命令行,进入到工程目录下的src目录下
第十三步:在命令行中输入javah + com.example.hellojni1.MainActivity(第六步中选择Copy Qualified Name复制好的完整的包名)
第十四步:刷新一下Android工程,此时可以看到在src文件夹下多了一个com_example_hellojni1_MainActivity.h文件
第十五步:打开com_example_hellojni1_MainActivity.h文件,并且将com_example_hellojni1_MainActivity.h文件中的下图的代码拷贝到hello.cpp文件中
第十六步:将hello.cpp改成hello.c,并且修改hello.c中到代码
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_example_hellojni1_MainActivity_helloC(JNIEnv env*, jobject obj)
{
char* str = "hello world jni !";
//把c语言的字符串转换成java的字符串
jstring jstr = (*env)->NewStringUTF(env, str);
return jstr;
}
第十七步: 修改Android.mk中的代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#设置编译生成的类库叫什么名字
LOCAL_MODULE := hello
#要编译的c文件
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)
第十八步:在jni文件夹下新建一个Application.mk文件用于设置编译成那个版本的类库
#生成intel架构的so文件,默认状态下只能生成arm架构的so文件
APP_ABI := armeabi armeabi-v7a x86