在開發(fā)Android應(yīng)用的過程中,通常有兩種方式:NDK和eclipse,或者直接在Android SDK增加。這里介紹如何在Android SDK環(huán)境中增加一個(gè)應(yīng)用程序。其中涉及到JNI,JAVA對JNI的調(diào)用,其中JNI代碼文件為C++。
--------------------------------------------------------------------------------
第一步,建立JNI層代碼,注意,JNI代碼的路徑與JAVA的代碼路徑有很大的關(guān)系,一定要保持一致。
在frameworks/base/core/jni目錄下建立JNI C++文件android_test.cpp,內(nèi)容如下:
#define LOG_TAG "FMC"
#include "jni.h"
#include "android_runtime/AndroidRuntime.h"
#include <nativehelper/JNIHelp.h>
#include "utils/Log.h"
extern "C" {
int test(void);//此函數(shù)可以來自c代碼或c庫
};
namespace android //注意名稱空間和JAVA調(diào)用JNI所有的路徑有緊密的關(guān)系,不能隨便取名稱空間。
{
static jint android_test(JNIEnv *env, jobject clazz)
{
return test();
}
static JNINativeMethod method_table[] = {
{ "my_test", "()I", (void*)android_test}, //第一個(gè)參數(shù)為字串,這是JAVA層看到的函數(shù)名;
//第二個(gè)參數(shù)為該函數(shù)的形參說明,
//JAVA代碼就是靠這個(gè)參數(shù)知道所調(diào)用函數(shù)的形參情況;
//第三個(gè)參數(shù)為JNI代碼中實(shí)際調(diào)用的C函數(shù)。
}
int register_android_test(JNIEnv *env)//這是JNI注冊函數(shù),android.test就是java調(diào)用層(第三步)看到的包路徑,
//如果這里是register_android_hardware_test,
//那么JAVA調(diào)用層需要導(dǎo)入android.hardware.test包
{
return AndroidRuntime::registerNativeMethods(env, "android/test/Test",method_table,NELEM(method_table));
/*這里的第二個(gè)參數(shù)和應(yīng)用層java文件調(diào)用包的路徑有關(guān)聯(lián),"android/test/Test"字符串參數(shù)和
frameworks/base/core/java/android/test/Test.java完整路徑是對應(yīng)的,對應(yīng)的包路徑是anroid.test,android.test.Test*/
}
};
--------------------------------------------------------------------------------
第二步,把JNI代碼注冊函數(shù)添加到AndroidRuntime運(yùn)行時(shí)庫中。編輯frameworks/base/core/jni/AndroidRuntime.cpp文件:
按照文件上的方法對應(yīng)的增加以下兩行:
..........
extern int register_android_test(JNIEnv* env);//這是android_test.cpp文件中的注冊函數(shù)
..........................
static const RegJNIRec gRegJNI[] = {
.........
.........
REG_JNI(register_android_test),
.........
.......
};
--------------------------------------------------------------------------------
第三步,建立JAVA調(diào)用層,在frameworks/base/core/java/android/test 目錄下建立文件Test.java,內(nèi)容如下:
package android.test;
/**
* Native methods for managing fm.
*
*/
public class Test {
private native int my_test();//Android 應(yīng)用的代碼中最終能調(diào)用的就是這個(gè)代碼
public Test()//構(gòu)造函數(shù)
{
//Add Your Code Here.............
}
};
--------------------------------------------------------------------------------
第四步,在packages/apps/test目錄下建立你的android應(yīng)用(具體建立方法這里就不再作介紹),假設(shè)test_app.java是應(yīng)用的主文件,則內(nèi)容如下:
package com.app;
import android.test;//導(dǎo)入自己的包
在代碼中這樣使用:
test test;
test.my_test();//最終調(diào)用
--------------------------------------------------------------------------------
Tags:
Android SDK JNI實(shí)現(xiàn),Android SDK JNI C++代碼,Android 調(diào)用C++,建立Android SDK下的JNI、JAVA應(yīng)用完整步驟,Android JAVA調(diào)用C++代碼