JNI学习2:android 调用C语言方法与C语言调用android方法
2015-01-24 21:39
316 查看
#include <jni.h> #include <stdio.h> #include <stdlib.h> #include <jni.h> #include <android/log.h> #define LOG_TAG "System.out" //日志乱码时请将项目文件编码设置为UTF-8 /**debug级别日志:ANDROID_LOG_DEBUG:级别,LOG_TAG:标签,__VA_ARGS__:日志内容)**/ #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) /**info级别日志:ANDROID_LOG_INFO:级别,LOG_TAG:标签,__VA_ARGS__:日志内容)**/ #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) extern "C" { /***java语言String转C语言char***/ char* JstringTochar(JNIEnv *env, jstring jstr) { char* rtn = NULL; jclass classtring = env->FindClass("java/lang/String"); jstring strencode = env->NewStringUTF("GB2312"); jmethodID mid = env->GetMethodID(classtring, "getBytes","(Ljava/lang/String;)[B"); jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode); jsize alen = env->GetArrayLength(barr); jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE); if (alen > 0) { rtn = (char*) malloc(alen + 1); memcpy(rtn, ba, alen); rtn[alen] = 0; } env->ReleaseByteArrayElements(barr, ba, 0); return rtn; } JNIEXPORT jstring Java_com_example_ndktest_JNIProvideer_hello(JNIEnv *env,jobject obj) { LOGD("%s", "haha"); return env->NewStringUTF("Hello from JNI !"); } /***2个整数相加***/ JNIEXPORT jint Java_com_example_ndktest_JNIProvideer_add(JNIEnv *env,jobject obj,jint x,jint y){ return x+y; } /***字符串转换***/ JNIEXPORT jstring Java_com_example_ndktest_JNIProvideer_sayHello(JNIEnv *env,jobject obj,jstring jstr){ char* p=JstringTochar(env,jstr); LOGI("sss%s",p); //strcat(p,helloWord)表示helloWordƴ拼接到p后面 return env->NewStringUTF(strcat(p,"helloWord")); } /***整数数组每一个元素加10***/ JNIEXPORT jintArray Java_com_example_ndktest_JNIProvideer_getIntArray(JNIEnv *env,jobject obj,jintArray jintarr){ //获取数组长度 int len=env->GetArrayLength(jintarr); LOGI("len=%d",len); //获取整数数组地址 jint* arr=env->GetIntArrayElements(jintarr,0); for (int i=0; i < len; i++) { *(arr+i)+=10; } return jintarr; } /***主动调用java对象中方法String getString() * ()Ljava/lang/String;表示参数为空,返回值为String***/ JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetString(JNIEnv *env,jobject obj) { jclass classz=env->FindClass("com/example/ndktest/JNIProvideer"); if(classz==0){ LOGI("can't find class"); }else{ LOGI("find class"); } jmethodID javaMethod=env->GetMethodID(classz,"getString","()Ljava/lang/String;"); if(javaMethod==0){ LOGI("can't find menthod"); }else{ LOGI("find menthod"); } jstring result= (jstring)env->CallObjectMethod(obj,javaMethod); char* p=JstringTochar(env,result); LOGI("result=%s",p); } /***主动调用java对象中方法int getAdd(int x,int y) * (II)I表示参数为2个整数,返回值为整数***/ JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetAdd(JNIEnv *env,jobject obj) { jclass classz=env->FindClass("com/example/ndktest/JNIProvideer"); if(classz==0){ LOGI("can't find class"); }else{ LOGI("find class"); } jmethodID javaMethod=env->GetMethodID(classz,"getAdd","(II)I"); if(javaMethod==0){ LOGI("can't find menthod"); }else{ LOGI("find menthod"); } int result= env->CallIntMethod(obj,javaMethod,7,7); LOGI("result=%d",result); } /***主动调用java对象中方法void getvoidMethod(String x) * (Ljava/lang/String;)V表示参数为String,返回值为空***/ JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetvoidMethod(JNIEnv *env,jobject obj) { jclass classz=env->FindClass("com/example/ndktest/JNIProvideer"); if(classz==0){ LOGI("can't find class"); }else{ LOGI("find class"); } jmethodID javaMethod=env->GetMethodID(classz,"getvoidMethod","(Ljava/lang/String;)V"); if(javaMethod==0){ LOGI("can't find menthod"); }else{ LOGI("找到方法"); } env->CallVoidMethod(obj,javaMethod,env->NewStringUTF("abc")); } }
package com.example.ndktest; import android.util.Log; public class JNIProvideer { static{ System.loadLibrary("ndkTest"); } public native int add(int x,int y); public native String sayHello(String s); public native int[] getIntArray(int[] ints); public native String hello(); public native void getJavaMethodForGetString(); public native void getJavaMethodForGetAdd(); public native void getJavaMethodForGetvoidMethod(); /** *让c语言主动调用的方法 * @return */ public String getString(){ return "hello"; } /** *让c语言主动调用的方法 * @return */ public int getAdd(int x,int y){ return x+y; } /** * 让c语言主动调用的方法 * @return */ public void getvoidMethod(String x){ Log.i("test", "输入值:"+x); } }
package com.example.ndktest; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { public native String hello(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); Button tx= (Button) findViewById(R.id.test); tx.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { JNIProvideer jNIProvideer=new JNIProvideer(); String result=""; //result=jNIProvideer.hello(); //int add=jNIProvideer.add(4, 5); //result=add+""; //int[] intarray=jNIProvideer.getIntArray(new int[]{3,5,5,4}); //for (int i = 0; i < intarray.length; i++) { //result+=intarray[i]; //} //result=jNIProvideer.sayHello("say:"); //jNIProvideer.getJavaMethodForGetString(); //jNIProvideer.getJavaMethodForGetAdd(); jNIProvideer.getJavaMethodForGetvoidMethod(); //Toast.makeText(getApplicationContext(), result, 0).show(); } }); } }
相关文章推荐
- Android绕过JNi 调用C语言的方法
- Android JNI开发之c语言调用java方法
- Android jni 使用C语言调用java中的log方法
- jni使用c语言调用android shell命令方法
- 【学习Android NDK开发】Java通过JNI调用native方法
- Java通过JNI调用C语言的方法
- Java通过JNI调用C语言的方法
- Android学习整理-常见控件调用方法
- JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口 (学习老罗的)
- 模仿android_debug_JNITest实现apk 调用framework java JNI中方法
- JNI学习-- C调用java方法
- 在android中通过JNI调用本地方法
- Android代码学习-嵌套类,嵌套接口,匿名类,接口引用,子类调用父类的方法
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
- android中关于jni调用java层方法的一些误导和见解
- android的HAL第一种调用hal方法中的JNI代码的实现:
- JNI学习------C语言调用Java (转)
- JNI学习--通过Java应用调用C语言的函数打印hello,world
- Android 在JNI中执行Java方法--C/C++调用Java