1.新建一个类,单独管理加载so文件以及调用本地方法的类
package cinread.jj.jniexample;
/**
* Created by pengjf on 2016/8/18.
*/
public class JniTest {
static{
System.loadLibrary("mobi_jj");
}
public native String stringFromJNI();
public native String stringFromJNItwo();
}
2.gradle配置
apply plugin: 'com.android.application'
android {
compileSdkVersion 19
buildToolsVersion "19.1.0"
defaultConfig {
applicationId "cinread.jj.jniexample"
minSdkVersion 16
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['src/main/libs']
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:19.1.0'
}
3.gradle.properties配置
android.useDeprecatedNdk=true
4.local.properties配置
sdk.dir=F\:\\work\\cinreadAdt\\sdk ndk.dir=C\:\\androidndkr10e
5.Activity调用
package cinread.jj.jniexample;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JniTest jt = new JniTest();
TextView txtView = (TextView) findViewById(R.id.text);
TextView txtView2 = (TextView) findViewById(R.id.text2);
txtView.setText(jt.stringFromJNI());
txtView2.setText(jt.stringFromJNItwo());
}
}
1.在main下新建jni目录
2.创建
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog -- 非必需 代表mobi_jj.c中有LOG函数,其他必需
LOCAL_MODULE := mobi_jj
LOCAL_SRC_FILES := mobi_jj.c
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_MODULES := mobi_jj
APP_ABI := armeabi armeabi-v7a x86 --单独填all,所有平台都生成so,单独写出来具体平台,就只生成具体的
mobi_jj.c --主要编写你的本地C代码,目前暂时举了2个传递字符串的例子
#include <android/log.h>
#include "cinread_jj_jniexample_JniTest.h"
#define LOG_TAG "libmobi_jj"
//
// Created by pengjf on 2016/8/18.
//
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
jstring Java_cinread_jj_jniexample_JniTest_stringFromJNI(JNIEnv* env, jobject thiz )
{
LOGI("show my strings from JNI");
return (*env)->NewStringUTF(env, "CinRead Mobi come on");
}
jstring Java_cinread_jj_jniexample_JniTest_stringFromJNItwo(JNIEnv* env, jobject thiz )
{
LOGI("show my strings from JNI two");
return (*env)->NewStringUTF(env, "CinRead Mobi come on two");
}
3.javah生成头文件
在AS下打开Terminal,cd到包下,执行
javah cinread.jj.jniexample.JniTest
javah 接你的包名+类名 生成了一个 cinread_jj_jniexample_JniTest.h 头文件,移动到jni目录下
4.在jni目录下打开cmd命令,执行ndk-build,生成了so文件并没有错误后,可以运行。(常见2个错误,请大家查阅相关资料)
三、结果展示,2个方法均传递了值