配置ndk 的环境, 参考网址: http://blog.csdn.net/xiuxiu_861223/article/details/78792939
实际代码:
页面:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="bw.com.day15.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入用户名" android:id="@+id/name_et_id"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入密码" android:id="@+id/pwd_et_id"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入验证码 1234" android:id="@+id/code_et_id"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登录" android:onClick="login" /> </LinearLayout>
代码:
1, 创建 JinTest.java
public class JniTest { private static Context context; public JniTest(Context context) { this.context = context; } //通过静态代码块 , 引入so 文件 static { System.loadLibrary("app"); } public static String codeError = "验证码错误"; public static String userNameError = "用户名错误"; public static String loginSuccess = "登录成功"; public static int count = 10; // native 修饰的方法 public static native String getStr(); public static native int getCount(); //登录的功能: 用户名, 密码, 验证码 public static native String login(String uName,String uPwd,int uCode); /** * 用C 访问java 显示登录信息 * javah -d jni -classpath ../../build/intermediates/classes/debug bw.com.day15.JniTest */ public static void showMessage(String message) { Toast.makeText(context,message, Toast.LENGTH_SHORT).show(); } }
2, 点击菜单栏的Make Module 'app'即可
3, 生成头文件(*.h)
首先打开工具栏的Terminal工具,使用cd命令定位到Moduel app的main目录
执行: 红色的文字是需要根据自己的Jni 改变的
javah -d jni -classpath ../../build/intermediates/classes/debug bw.com.day15.JniTest
4, 创建 :bw_com_day15_JniTest.c
#include "bw_com_day15_JniTest.h" JNIEXPORT jstring JNICALL Java_bw_com_day15_JniTest_login (JNIEnv *env, jclass jobj, jstring juName, jstring juPwd, jint jcode) { const char* resultMessage;//声明字符变量 jclass jc; //1, 加载java 类中的class 对象 jc = (*env)->FindClass(env, "bw/com/day15/JniTest");//反射机制来获取对象 //jc = (*env)->GetObjectClass(env, jobj);//使用GetObjectClass函数来获取class对象: //2, 获取java 类的成员变量 //2.1 获取java 类成员变量的id jfieldID errorCodeID = (*env)->GetStaticFieldID(env,jc,"codeError","Ljava/lang/String;"); jfieldID userNameErrorID = (*env)->GetStaticFieldID(env,jc,"userNameError","Ljava/lang/String;"); jfieldID loginSuccessID = (*env)->GetStaticFieldID(env,jc,"loginSuccess","Ljava/lang/String;"); //2.2 通过成员变量id , 获取java 类成员变量 jstring jerrorCode= (*env)->GetStaticObjectField(env,jc,errorCodeID); jstring juserNameError= (*env)->GetStaticObjectField(env,jc,userNameErrorID); jstring jloginSuccess = (*env)->GetStaticObjectField(env,jc,loginSuccessID); //3, 获取java 类的方法 //3.1 获取java 类的方法 jmethodID showMessage = (*env)->GetStaticMethodID(env,jc,"showMessage","(Ljava/lang/String;)V"); //查看验证码是否正确 if(jcode==1234) { const char* cstr; jboolean isCopy; cstr = (*env)->GetStringUTFChars(env,juName,&isCopy); int result = strcmp(cstr,"admin"); if(result==0) { resultMessage = "login success"; // 3.2 通过方法的id , 回调java 的代码 (*env)->CallStaticVoidMethod(env,jc,showMessage,jloginSuccess); }else { resultMessage = "login Error"; // 3.2 通过方法的id , 回调java 的代码 (*env)->CallStaticVoidMethod(env,jc,showMessage,juserNameError); } } else { resultMessage = "code Error"; // 3.2 通过方法的id , 回调java 的代码 (*env)->CallStaticVoidMethod(env,jc,showMessage,jerrorCode); } return jloginSuccess; } // 返回int 类型的变量 JNIEXPORT jint JNICALL Java_bw_com_day15_JniTest_getCount (JNIEnv *env, jclass jobj) { jclass jc; //1, 加载java 类中的class 对象 jc = (*env)->FindClass(env, "bw/com/day15/JniTest");//反射机制来获取对象 //jc = (*env)->GetObjectClass(env, jobj);//使用GetObjectClass函数来获取class对象: //得到int 类型的变量 jfieldID fid = (*env)->GetStaticFieldID(env, jc, "count", "I"); // 3.获取静态变量num的值 jint num = (*env)->GetStaticIntField(env,jc,fid); return num; }
5, 准备就绪,开始构建.so文件 -- 点击菜单栏的Make Module 'app'即可
6,
使用so库。在JniTest.java中添加代码
static {
System.loadLibrary("app");
}
7, MainActivity.java
public class MainActivity extends AppCompatActivity { private EditText nameEt; private EditText pwdEt; private EditText codeEt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nameEt = (EditText) findViewById(R.id.name_et_id); pwdEt = (EditText) findViewById(R.id.pwd_et_id); codeEt = (EditText) findViewById(R.id.code_et_id); } public void login(View view) { JniTest jniTest = new JniTest(this); int code =Integer.parseInt(codeEt.getText().toString());//String--> int String str = jniTest.login(nameEt.getText().toString(),pwdEt.getText().toString(),code); int count = JniTest.getCount(); //Toast.makeText(this, str + "----->"+count, Toast.LENGTH_SHORT).show(); } }