系统:mac OS,IDE:Android Studio,sdk 5.0,ndk r10e
1, 找到当前用户下的,.bashrc, 添加 export PATH=~~~ndk/android-ndk-r10e:$PATH,
保存退出,执行 source ~/.bashrc 。其中~~~ndk/android-ndk-r10e是你ndk本地的路径
2,创建Android项目
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("jni-test"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView txtOne = (TextView) findViewById(R.id.txt_test_1); txtOne.setText(get()); set("from jni"); } public native String get(); public native void set(String str); public static void methodCallByJni(String msgFromJni) { Log.i("-----jniCallJava", msgFromJni); } }
3,创建jni目录,与java目录同级,创建文件:test.cpp, Android.mk, Application.mk
test.cpp
#include <jni.h> #include <stdio.h> #ifdef __cplusplus extern "C" { #endif void callJavaMethod(JNIEnv *env, jobject thiz) { jclass clazz = env->FindClass("com/yuliang/ndktest/MainActivity"); if (clazz == NULL) { printf("find class MainActivity error!"); return; } jmethodID id = env->GetStaticMethodID(clazz, "methodCallByJni", "(Ljava/lang/String;)V"); if (id == NULL) { printf("find method methodCallByJni error!"); } jstring msg = env->NewStringUTF("msg send by methodCallByJni in test.cpp"); env->CallStaticVoidMethod(clazz, id, msg); } jstring Java_com_yuliang_ndktest_MainActivity_get(JNIEnv *env, jobject thiz) { printf("invoke get in c++\n"); callJavaMethod(env, thiz); return env->NewStringUTF("from JNI so!"); } void Java_com_yuliang_ndktest_MainActivity_set(JNIEnv *env, jobject thiz, jstring string) { printf("invoke set from c++\n"); char* str = (char*)env->GetStringUTFChars(string, NULL); printf("%s\n", str); env->ReleaseStringUTFChars(string, str); } #ifdef __cplusplus } #endifAndroid.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := jni-test LOCAL_SRC_FILES := test.cpp include $(BUILD_SHARED_LIBRARY)Application.mk
APP_ABI := armeabi armeabi-v7a
4,切换到jni父目录,执行ndk-build进行编译,生成与jni同级目录libs下,有.so文件,与jni同级创建jniLibs,将.so复制到此处。
5,app的build.gradle文件进行修改
defaultConfig { applicationId "com.yuliang.ndktest" minSdkVersion 21 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk { moduleName "jni-test" } }
packagingOptions {
exclude 'lib/armeabi/libjni-test.so'
}
6, 项目的gradle.properties
android.useDeprecatedNdk=true"
7, 项目的local.properties,你本机ndk路径
ndk.dir=................/ndk/android-ndk-r10e
8,如果多人开发,其他开发者需要做的事
(1)java代码相同
(2)创建同样的jinLibs,如果.so是armeabi,需要再创建armeabi目录
(3)项目的gradle.properties 文件 android.useDeprecatedNdk=true"