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文件中添加<jni.h>头文件
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 <stdio.h>
#include <stdlib.h>
#include <jni.h> //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;
}

Application.mk中:APP_ABI := armeabi armeabi-v7a x86 //表示不同的架构
java代码很容易反编译,c代码反编译比较难。
java代码最后使用的是c代码编译后的类库,原C代码已经没用了。
android111 java中调用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中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误
错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/S ...
- 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允许你为脚 ...
随机推荐
- LINQ TO SQL 怎样 执行存储过程并返回存储过程的临时表
查了GOOGLE一下,这种办法可以解决 我的存储过程是这样的: CREATE procedure cal_month_dep_fast @begdt datetime,@endt datetime ...
- [OJ] Wildcard Matching (Hard)
LintCode 192. Wildcard Matching (Hard) LeetCode 44. Wildcard Matching (Hard) 第二次刷还是被这题虐. 其实就是跪在一个地方, ...
- C# SerialPort的简单使用
SerialPort中串口数据的读取与写入有较大的不同.由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取.一.线程实时读串口:二.事件触发方式实现.由于线程实时读串口的效率不是十分高效 ...
- udhcpc 参数使用说明
当没有网络的时候,板子一直发送dhcp请求,导致程序不往下执行,解决的办法是把它切换到后台运行,可是如何切换到后台呢,有办法,它自带参数可以实现该功能.如下: udhcpc -b -i eth0 -p ...
- Android与PHP服务器交互
转自:http://blog.csdn.net/ab_ba/article/details/7912424 服务器端:server.php 1 <?php 2 include(' ...
- 一行代码搞定Adapter
15年Google I/O大会发不了三个重要支持库 >Material design (Android Support Design) >百分比布局:Percent support lib ...
- 【原】数据库SQL语句入门
1.数据定义DDL(Data Definition Language)语言即对表结构的一些定义,主要包括动词为CREATE/DROP/ALTER. 1.1.CREATE语句 CREATE TABLE ...
- å∫ç∂´ƒ©˙ˆ∆˚¬µ˜øπœ®ß†¨√∑≈¥Ω who know?
´é∑w∑w∑wqq¡œœ∑åååß∂˚¬∆¬˚∆˙ß∂ƒµ˜∫√ç≍Ωåœ∑´®†¥¨ˆøπ“‘æ…¬˚∆˙©ƒ∂ßåΩ≍ç≍ç√∫˜µ≤≥÷÷¡™£¢∞§§¶••ªº–≠«``¡™£¢∞§¶•ªº ...
- bitset位图讲解
bitset可以用来处理位图问题,用位可以大大减少占用的空间内存,但是位图问题适合处理不重复的,在一定范围内的整数问题.用两个位图可以处理只出现一次问题 #include <bitset> ...
- 1到n数组,和为指定数所有序列问题
(1)方法一,背包问题解法 #include <iostream> using namespace std; #include <vector> #include <li ...