android111 java中调用c代码
生活随笔
收集整理的這篇文章主要介紹了
android111 java中调用c代码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
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中指定的名字。 }@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/*##使用jni1. 在項目根目錄下創(chuàng)建jni文件夾2. 在jni文件中創(chuàng)建一個c文件(src是寫java代碼的)3. 在java代碼中,創(chuàng)建一個本地方法helloFromCpublic native String helloFromC();4. 在jni中定義函數(shù)實現(xiàn)這個方法,函數(shù)名必須為jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)5. 返回一個字符串,用c定義一個字符串char* cstr = "hello from c";6. 把c的字符串轉(zhuǎn)換成java的字符串jstring jstr = (*env)->NewStringUTF(env, cstr);return jstr;7. 在jni中創(chuàng)建Android.mk文件8. 在c文件中添加<jni.h>頭文件9. 在jni文件夾下執(zhí)行ndk-build.cmd指令( 在磁盤jni文件夾下用cmd命令編譯,編譯完后在libs下的armeabi文件夾下有一個libhello.so文件,這就是編譯后的c代碼)10. java代碼中加載so類庫,調(diào)用本地方法*/public void click(View v){Toast.makeText(this, helloFromC(), 0).show();}//定義一個本地方法,方法體由c語言實現(xiàn)public native String helloFromC();}Android.mk
# mk是make的意思LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)#編譯后生成的文件的類庫叫什么名字LOCAL_MODULE := hello#要編譯的c文件LOCAL_SRC_FILES := Hello.cinclude $(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是必須寫的參數(shù),env是java虛擬機的內(nèi)存地址,java代碼是運行在虛擬機的而C代碼不是運行在虛擬機的, //env本來就是一個結(jié)構(gòu)體指針,此處* env是一個java運行環(huán)境的二級指針,obj是MainActivity對象,C中jobject表示對象。 jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj){//c語言的字符串不是string,是字符數(shù)組,char* cstr或者char cstr[],數(shù)組的名字就是第0個元素的地址,char* cstr = "hello from c";//把C語言的字符串轉(zhuǎn)換成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 //表示不同的架構(gòu)
java代碼很容易反編譯,c代碼反編譯比較難。
java代碼最后使用的是c代碼編譯后的類庫,原C代碼已經(jīng)沒用了。
本文轉(zhuǎn)自農(nóng)夫山泉別墅博客園博客,原文鏈接:http://www.cnblogs.com/yaowen/p/4986806.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的android111 java中调用c代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python pickle模块操作
- 下一篇: 存储引擎之必知必会 -- 检查点机制