在前面的博客中介紹了在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