1.編寫java類,定義Native方法,這裏的native方法就是後面.c文件(c/c++語言)裏面要實現的方法名。示例:
public class JniClient
{
public static native String AddStr(String strA,String strB);
public static native int AddInt(int a,int b);
}
2.根據上面的JinClient類使用cmd命令自動生成.h文件。com_example_testndk_JniClient.h
如下內容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_testndk_JniClient */
#ifndef _Included_com_example_testndk_JniClient
#define _Included_com_example_testndk_JniClient
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_testndk_JniClient
* Method: AddStr
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_testndk_JniClient_AddStr
(JNIEnv *, jclass, jstring, jstring);
/*
* Class: com_example_testndk_JniClient
* Method: AddInt
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_testndk_JniClient_AddInt
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
3.新建一個.c文件,實現com_example_testndk_JniClient.h裏面的兩個方法,這裏就是JniClient類Native要調用的方法要實現的功能。
如下內容:
#include "com_example_testndk_JniClient.h"
#include <stdlib.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C"
{
#endif
/*
* Class: com_ndk_test_JniClient
* Method: AddStr
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_testndk_JniClient_AddStr
(JNIEnv *env, jclass arg, jstring instringA, jstring instringB)
{
jstring str = (*env)->NewStringUTF(env, "HelloWorld from JNI !");
return str;
}
/*
* Class: com_ndk_test_JniClient
* Method: AddInt
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_testndk_JniClient_AddInt
(JNIEnv *env, jclass arg, jint a, jint b)
{
return a + b;
}
#ifdef __cplusplus
}
#endif
4.創建Android.mk文件,內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestNdk
LOCAL_SRC_FILES := JniClient.c
include $(BUILD_SHARED_LIBRARY)
5.編譯生成.so文件庫
6.調用JNI方法,如下內容:
public class MainActivity extends Activity
{
static {
//注意這裏的“TestNdk”加載庫名與本目錄文件下的.so文件名一一對應,省略開頭的lib和結尾的.so後綴
System.loadLibrary("TestNdk");
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
//第一個方法傳入的兩個參數沒有做操作,直接返回hello jni,不用管
String str = JniClient.AddStr("test", "test");
//第二個方法
int iSum = JniClient.AddInt(10, 2);
TextView tv1 = new TextView(this);
tv1.setText(iSum+"");
setContentView(tv1);
}
}