android java调用c_android111 java中调用c代码

MainActivity:

package com.itheima.helloworld1;

import android.os.Bundle;

import android.app.Activity;

import android.view.View;

import android.widget.Toast;

public class MainActivity extends Activity {

static{

//加载打包完毕的so类库

System.loadLibrary("hello");//hello是Abdroid.mk中指定的名字。

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

/*##使用jni

1. 在项目根目录下创建jni文件夹

2. 在jni文件中创建一个c文件(src是写java代码的)

3. 在java代码中,创建一个本地方法helloFromC

public native String helloFromC();

4. 在jni中定义函数实现这个方法,函数名必须为

jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)

5. 返回一个字符串,用c定义一个字符串

char* cstr = "hello from c";

6. 把c的字符串转换成java的字符串

jstring jstr = (*env)->NewStringUTF(env, cstr);

return jstr;

7. 在jni中创建Android.mk文件

8. 在c文件中添加头文件

9. 在jni文件夹下执行ndk-build.cmd指令( 在磁盘jni文件夹下用cmd命令编译,编译完后在libs下的armeabi文件夹下有一个libhello.so文件,这就是编译后的c代码)

10. java代码中加载so类库,调用本地方法*/

public void click(View v){

Toast.makeText(this, helloFromC(), ).show();

}

//定义一个本地方法,方法体由c语言实现

public native String helloFromC();

}

Android.mk

# mk是make的意思

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#编译后生成的文件的类库叫什么名字

LOCAL_MODULE := hello

#要编译的c文件

LOCAL_SRC_FILES := Hello.c

include $(BUILD_SHARED_LIBRARY)

Hello.c

#include

#include

#include

//jstring表示string,Java_com_itheima_helloworld1_MainActivity_helloFromC是包名类名方法名

//JNIEnv* env, jobject obj是必须写的参数,env是java虚拟机的内存地址,java代码是运行在虚拟机的而C代码不是运行在虚拟机的,

//env本来就是一个结构体指针,此处* env是一个java运行环境的二级指针,obj是MainActivity对象,C中jobject表示对象。

jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj){

//c语言的字符串不是string,是字符数组,char* cstr或者char cstr[],数组的名字就是第0个元素的地址,

char* cstr = "hello from c";

//把C语言的字符串转换成java的字符串

// jstring (*NewStringUTF)(JNIEnv*, const char*);

// jstring jstr = (*(*env)).NewStringUTF(env, cstr);

jstring jstr = (*env)->NewStringUTF(env, cstr);

return jstr;

}

30eaaf86f637047892fcd3d02f53e69d.png

Application.mk中:APP_ABI := armeabi armeabi-v7a x86 //表示不同的架构

java代码很容易反编译,c代码反编译比较难。

java代码最后使用的是c代码编译后的类库,原C代码已经没用了。

如何在Java中调用Python代码

有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...

在Java中调用Python代码

极少数时候,我们会碰到类似这样的问题:与A同学合作写代码, A同学只会写Python,不熟悉Java ,而你只会写Java不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方 ...

Java中调用MatLab返回值

当在Java中使用MatLab函数时,由于语言语法的不同,Matlab返回多个数据时,想在Java中获取到并进行使用.查阅了网上资料,翻箱倒柜加上自己实战,得出方法如下: 如MatLab函数返回的是N ...

2.java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名. ...

使用Runtime.getRuntime().exec()在java中调用python脚本

举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

java中调用dll文件的两种方法

一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNativ ...

java中执行js代码

要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...

java中调用js脚本

JDK1.6加入了对Script(JSR223)的支持.这是一个脚本框架,提供了让脚本语言来访问Java内部的方法.你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本.这个脚本API允许你为脚 ...

随机推荐

mysql-数据类型与java数据类型转化工具类

mysql和java对照表 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.Stri ...

[转]MySQL主从复制入门

1.MySQL主从复制入门 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的33 ...

c++标准模板库algorithm头文件中accumulate算法的代码

template T algorithm(T* start, T* end, T total)//把[start, end)标记范围内所有元素累加到total中{  ...

tomcat 7 用户设置

在tomcat/conf/tomcat-users.xml加入如下脚本就可以了

POJ 2488-A Knight's Journey(DFS)

A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31702   Accepted: 10 ...

Android学习笔记--Handler用法总结

不错的例子:http://www.cnblogs.com/menlsh/archive/2013/06/07/3125341.html 转自:一叶知秋的博客 http://blog.sina.com. ...

Win下安装MySQL 5.6

最近身边有人要win下安装mysql 去学习数据库,问我如何安装MySQL,其实win 下安装要比Linux简单的多,直接运行安装包下一步安装即可. 1.首先我们运行mysql-installer-c ...

【翻译】在Sencha应用程序中使用插件和混入

原文:Using Plugins and Mixins in Your Sencha Apps 概述 当扩展一个框架类的功能的时候,通常都会直接将新功能写入派生类,然而,如果所需的同一功能存在于多个组 ...

golang http.client 遇到了 Connection reset by peer 问题

最近一个 golang 写的 http.client 的,获取远程服务器数据,有时候会报错,尤其在数量很大的时候,老是收到 Connection reset by peer 这样的 提醒,都有点想用重 ...

idea springboot jrebel hotreloaded

http://127.0.0.1:8888/88414687-3b91-4286-89ba-2dc813b107ce

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值