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代码的更多相关文章

  1. 如何在Java中调用Python代码

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

  2. 在Java中调用Python代码

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

  3. Java中调用MatLab返回值

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

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

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

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

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

  6. 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 ...

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

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

  8. java中执行js代码

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

  9. java中调用js脚本

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

随机推荐

  1. ANDROID_MARS学习笔记_S02_007_Animation第一种使用方式:代码

    一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  2. android 与usb 设备通信(二)

    再次遇到android  mUsbManager.getDevicelist() 得不到usb 设备的问题.于是深入去探讨android 与usb 外围设备通信的问题.第一篇文章写的有点乱,本质就是需 ...

  3. Excel Cannot Connect to SharePoint List

    As I am working in SharePoint support, I come across so many issues on day 2 day basis and always tr ...

  4. logstash gsub替换

    { "message" => "192.168.11.186,192.168.11.187\t48391,3306\tDec 7, 2016 13:26:25.13 ...

  5. 在Sharepoint2010中发布VS2010开发的WebPart

    转:http://www.cnblogs.com/bfgl/archive/2012/03/22/2411698.html 本人接触Sharepoint2010到今天为止不到一个月.作为一名老C#程序 ...

  6. word 中Sentences、Paragraph等含义和用法

    word 中有Words,Characters,Sentences.Paragraph,Sections 具体含义如下表达式             含义   返回的对象 Words(index)  ...

  7. Git分支管理的基本操作

    首先从远端版本库clone下来一个全新的库: git clone username@xxx:/xxx/xxx.git 此时clone下来的,只是master分支,没有其他分支. 查看分支: git b ...

  8. leecode 归并排序 链表(java)

    写了好久,终于写成了.第一次zai leecode错题,题目质量很高,适合面试,与 1.归并排序是稳定的,在java中 Arrays.sort(a);中对于对象的排序就是归并排序.对于原子类型数据使用 ...

  9. JDK1.5新特性(二)……Static Import

    援引 Static Import - This facility lets you avoid qualifying static members with class names without t ...

  10. leetcode—pascal triangle

    1.题目描述 Given numRows, generate the first numRows of Pascal's triangle.   For example, given numRows ...