日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

android111 java中调用c代码

發(fā)布時間:2025/3/18 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。