您的位置:首页 > 移动开发 > Android开发

Android NDK编程

2016-03-23 16:45 435 查看
系统: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
}
#endif

Android.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"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: