JNI学习2:android 调用C语言方法与C语言调用android方法
- #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();
- }
- });
- }
- }
JNI学习2:android 调用C语言方法与C语言调用android方法的更多相关文章
- JNI学习笔记_Java调用C —— 非Android中使用的方法
一.学习笔记 1.java源码中的JNI函数本机方法声明必须使用native修饰. 2.相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,为了应用的安 ...
- JNI学习笔记_Java调用C —— Android中使用的方法
一.笔记 1.JNI(Java Native Interface),就是如何使用java去访问C/C++编写的那些库.若想深入了解JNI可以看官方文档jni.pdf.优秀博文:Android JNI知 ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI 学习(一):JNI 简介
JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...
- Android JNI学习(二)——实战JNI之“hello world”
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI学习(五)——Demo演示
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI学习(四)——JNI的常用方法的中文API
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android NDK 初探,生成so文件以及调用so文件方法
因为最近业务上涉及安全的问题 然后有一些加密解密的方法和key的存储问题 本来想存储到手机里面,但是网上说一般敏感信息不要存储到手机Sdcard上 而且我这个如果从网络建立通信获取的话,又太耗时,所以 ...
- 技术转载:Jni学习四:如何编写jni方法
转载:http://blog.chinaunix.net/u1/38994/showart_1099528.html 一.概述: 在这篇文章中将会简单介绍如何编制一些简单的JNI 方法.我们都知道JN ...
随机推荐
- jstl表达式替换某些字符
转自:http://www.yiibai.com/jsp/jstl_function_replace.html fn:replace() 函数替换一个字符串与另一个字符串的所有匹配. 语法 fn:re ...
- 转 15款免费WiFi(入侵破解)安全测试工具
转:http://www.ctocio.com/security/cloudsecurity/6594.html 一.Vistumbler扫描器 WiFi 扫描器能能发现附近AP的详细信息,例如信号强 ...
- 无线安全渗透测试套件WiFi-Pumpkin新版本发布
WiFi-Pumpkin是一款无线安全检测工具,利用该工具可以伪造接入点完成中间人攻击,同时也支持一些其它的无线渗透功能.旨在提供更安全的无线网络服务,该工具可用来监听目标的流量数据,通过无线钓鱼的方 ...
- Osmocom-BB多信道修改代码相关
修改bb\src\target\firmware\layer1\prim_rx_nb.c 文件 这个nb表示normalburst,指的是ccch的数据,用专业的术语,应该是,一个ccch的burst ...
- HDOJ-三部曲一(搜索、数学)-1008-Prime Path
Prime Path Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total S ...
- JQuery源码分析(六)
方法链式调用的实现 写的更少,做的更多.是JQuery的核心理念. 那么链式方法的设计与这个核心理念不谋而合.那么从深层次考虑这种设计其实就是一种Internal DSL. DSL是指Domain S ...
- 13、C#基础整理(枚举)
枚举 1.概念和作用 (1)用于存放常量,只能在定义时赋值(防止编程过程中恶意篡改,并且防止对同一事物的不同赋值--统一化) (2)定义的枚举类型需要包含该类型的所有可能的值 (3)方法.类.内部都可 ...
- HDU 1052
http://acm.hdu.edu.cn/showproblem.php?pid=1052 田忌赛马本质就是一个贪心 res表示田忌的胜利场次 1.田忌最快马快于王的最快马,两个最快马比,res++ ...
- HDU 5050
http://acm.hdu.edu.cn/showproblem.php?pid=5050 大数gcd import java.io.* ; import java.math.* ; import ...
- php-多态
<?php //面对对象三大特性//封装//目的:让类更安全//做法:成员变量变为私有的,通过方法来间接操作成员变量,在方法里面加限制条件 //继承//概念:子类可以继承父类的一切//方法重写: ...