利用JNI技术在Android中调用C++代码
JNI是Java Native Interface的簡稱,也就是Java本地接口,它提供了若干的API實(shí)現(xiàn)Java和其它語言的通信(主要是C&C++)。
?
1、打開Eclipse,File-->New-->Project…-->AndroidApplication Project-->Application Name:TestJNI,PackageName:com.testjni.android, Minimum Required SDK:API 10, Android 2.3.3(Gingerbread),Next-->不勾選 Createcustom launcher icon, 勾選Create activity,Next-->選中 BlankActivity,Next-->Activity Name:TestJNIProjectActivity, -->Finish,運(yùn)行AndroidApplication顯示正確;
2、選中src-->com.testjni.android,打開TestJNIProjectActivity.java文件內(nèi)代碼改為:
?
package com.testjni.android;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;public class TestJNIProjectActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView tv = new TextView(this); tv.setText(StringFromJni()); setContentView(tv); }public native String StringFromJni();static{System.loadLibrary("hello-jni");}}
?
3、編譯該工程,會(huì)在bin\classes\com\testjni\android文件夾下生成TestJNIProjectActivity.class文件;
4、打開命令行窗口,將其定位到\bin\classes目錄下,輸入命令:javah –classpath ??D:\ProgramFiles\Android\android-sdk\platforms\android-10\android.jar;com.testjni.android.TestJNIProjectActivity,會(huì)在classes文件夾下生成com_testjni_android_TestJNIProjectActivity.h(說明:*.jar也可以是其它版本);
5、選中TestJNI工程,點(diǎn)擊右鍵-->New-->Folder新建一個(gè)jni文件夾,選中jni, -->New-->File,新建2個(gè)文件,名稱分別為hello-jni.c,Android.mk;
6、編寫hello-jni.c文件,代碼為:
?
#include <string.h>
#include <jni.h>JNIEXPORT jstring JNICALL Java_com_testjni_android_TestJNIProjectActivity_StringFromJni(JNIEnv * env, jobject thiz)
{return (*env)->NewStringUTF(env, "Hello from JNI !");
}
?
?
?
7、 創(chuàng)建Android.mk文件,其內(nèi)容為:
?
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jniLOCAL_SRC_FILES := hello-jni.cinclude $(BUILD_SHARED_LIBRARY)
?
?
?
8、利用NDK生成.so文件:選中工程,點(diǎn)擊右鍵-->Properties-->Builders-->New,新建立一個(gè)Builder,在彈出的對話框上點(diǎn)中Program,點(diǎn)擊OK;在彈出對話框EditConfiguration中,配置選項(xiàng)卡Main:Location中填入NDK安裝目錄,D:\ProgramFiles\Android\android-sdk\android-ndk-r9\ndk-build.cmd;WorkingDirectory中填入工程的根目錄,E:\Test\Android\HelloJni,點(diǎn)擊Apply;配置選項(xiàng)卡Refresh,勾選Refreshresources upon completion, The entire workspace, Recursively includesub-folders,點(diǎn)擊Apply;配置Build Options選項(xiàng)卡,勾選Allocate Console(necessary for input), After a “Clean”, Duringmanual builds, During auto builds, Specify working set of relevant resources,點(diǎn)擊SpecifyResources..,勾選TestJNI工程的jni目錄,點(diǎn)擊Finish,點(diǎn)擊Apply,點(diǎn)擊OK,會(huì)在\libs\armeabi目錄下生成相應(yīng)的libhello-jni.so庫;
9、運(yùn)行該工程,一切顯示正確。
以上是.c文件的操作步驟,若將.c文件該為.cpp文件,則需改動(dòng)兩個(gè)文件:
1、Android.mk:
?
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jniLOCAL_SRC_FILES := hello-jni.cppinclude $(BUILD_SHARED_LIBRARY)
2、hello-jni.cpp:
?
?
#include <string.h>
#include <jni.h>#ifdef __cplusplus
extern "C" {
#endifJNIEXPORT jstring JNICALL Java_com_example_testjni_TestJNIProjectActivity_StringFromJni(JNIEnv * env, jobject thiz)
{return env->NewStringUTF("Hello from JNI !");
}#ifdef __cplusplus
}
#endif
?
?
?
?
?
?
參考文獻(xiàn):
1、? http://blog.csdn.net/haha_mingg/article/details/6332115
2、? http://blog.csdn.net/cghs123/article/details/7044826
3、 ?http://blog.csdn.net/laczff21/article/details/7542236
4、?android-ndk-r9-windows-x86_64中例子代碼
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的利用JNI技术在Android中调用C++代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse中通过Android模拟器
- 下一篇: 利用JNI技术在Android中调用C+