基本步骤:
1.编写A类,生成A.class
2.生成A.h
3.编写A.cpp
4.配置生成.so
5.loadLibrary,调用native方法
Step1:编写A类,生成A.class
示例:
public class TestNdk {
public native String getStr(String str);
static {
System.loadLibrary("JniDemo");
}
}
Step2.生成A.h
通过javah命令,将class文件转换成头文件
示例:
到classes根目录:javah -classpath ./ com.**.**.JNITest
头文件会在jni目录下生成
示例:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ksmobile_launcher_custom_TestNdk */
#ifndef _Included_com_ksmobile_launcher_custom_TestNdk
#define _Included_com_ksmobile_launcher_custom_TestNdk
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ksmobile_launcher_custom_TestNdk
* Method: getStr
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ksmobile_launcher_custom_TestNdk_getStr
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
Step3.编写A.cpp
或者A.c 可以任意命名,也可以是c或者c++文件
#include "com_ksmobile_launcher_custom_TestNdk.h"
JNIEXPORT jstring JNICALL Java_com_ksmobile_launcher_custom_TestNdk_getStr
(JNIEnv *env, jobject obj, jstring str){
//注意(JNIEnv *, jobject, jstring)与头文件中不同
return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!");
}
#endif
Step4.配置生成.so
build.gradle 增加生成so的名称配置,还可以增加其他配置
示例:
defaultConfig {
applicationId "com.ksmobile.launcher"
minSdkVersion 14
targetSdkVersion 17
ndk{
moduleName "JniDemo" //设置库(so)文件名称
}
}
Step5.loadLibrary,调用native方法
其实之前写java类时已经写了,主要是这一句
static {
System.loadLibrary("JniDemo");
}
调用
Log.d("","ndk:str:"+new TestNdk().getStr("arg str"));
Eclipse中新建Builder生成so
1.NDK方式
2.NDK+cygwin方式,NDK(r8)不需要cygwin了