日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android NDK编程小试---实现java和c语言的互掉

發(fā)布時(shí)間:2025/4/16 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android NDK编程小试---实现java和c语言的互掉 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(shí)現(xiàn)功能

l? 實(shí)現(xiàn) java/C互相調(diào)用 android端java調(diào)用LibMain 進(jìn)而執(zhí)行C語言 并且傳入字符數(shù)組

l? C語言回調(diào)java Natives類的OnMessage方法打印消息,實(shí)現(xiàn)一個(gè)日志打印功能

l? 通過本次NDK學(xué)習(xí),掌握NDK開發(fā)環(huán)境的配置、C語言的編譯成.so庫

Android java層代碼

Natives類:


public class Natives {

?? /***

?? ?* 原生庫主入口

?? ?* @param argv

?? ?* @return

?? ?*/

?? public static native int LibMain(String []argv);

?? /**

?? ?* C語言調(diào)用實(shí)現(xiàn)日志打印

?? ?* @param text

?? ?* @param level

?? ?*/

?? private static void OnMessage(String text,int level)

?? {

???? System.out.println("OnMessage text :"+text+" level="+level);

?? }

該類只是聲明一個(gè)原生方法nt LibMain(String[]argv)供遠(yuǎn)程層調(diào)用。并且一個(gè)打印消息的方法,用于遠(yuǎn)程層調(diào)用,可以打印日志,用于原生層的調(diào)試。該類通過javah –jni com.flying.NDKTest1.Natives.java 能夠生成頭文件。

?

MainActiity類

public class MainActivity extends Activity {

?

?? @Override

?? protected void onCreate(Bundle savedInstanceState) {

???? super.onCreate(savedInstanceState);

???? setContentView(R.layout.activity_main);

???? String argv[]={"MyLib","arg1","arg2"};

???? try

???? {

???? Natives.LibMain(argv);

???? }

???? catch(Exception e)

???? {

??????? e.printStackTrace();

???? }

?? }

?

?? static{

???? System.loadLibrary("NDKTest1"); //加載.so庫

?? }

?

}

?

原生層代碼

Natives生成的頭文件

#include <jni.h>

/* Header for class com_flying_ndktest1_Natives */

?

#ifndef _Included_com_flying_ndktest1_Natives

#define _Included_com_flying_ndktest1_Natives

#ifdef __cplusplus

extern "C" {

#endif

/*

?* Class:???? com_flying_ndktest1_Natives

?* Method:??? LibMain

?* Signature: ([Ljava/lang/String;)I

?*/

JNIEXPORT jint JNICALL Java_com_flying_ndktest1_Natives_LibMain

? (JNIEnv *, jclass, jobjectArray);

?

#ifdef __cplusplus

}

#endif

#endif

?

Lib.c

#include "com_flying_ndktest1_Natives.h"

#include <stdio.h>

#include <stdlib.h>

#define CB_CLASS "com_flying_ndktest1_Natives"

?

/**

?* OnMessage 回調(diào)方法

?*/

#define CB_CLASS_CB "OnMessage"

#define CB_CLASS_MSG_SIG "(Ljava/lang/String;I)v"

?

?

int lib_main(int argc ,char **argv);

?

const int getArrayLen(JNIEnv *env,jobjectArray jarray);

?

void jni_printf(char *format,...);

?

static JavaVM *g_VM;

?

static jclass jNativesCls;

?

/*

?* Class:???? com_flying_ndktest1_Natives

?* Method:??? LibMain

?* Signature: ([Ljava/lang/String;)I

?*/

JNIEXPORT jint JNICALL Java_com_flying_ndktest1_Natives_LibMain

? (JNIEnv * env, jclass class, jobjectArray jargv)

???????? {

?????????????????? (*env)->GetJavaVM(env,&g_VM);

?

?????????????????? jsize clen=getArrayLen(env,jargv);

?

?????????????????? char *args[(int)clen];

?

?????????????????? int i;

?????????????????? jstring jrow;

?

?????????????????? for(i=0;i<clen;i++)

?????????????????? {

??????????????????????????? jrow=(jstring)(*env)->GetObjectArrayElement(env,jargv,i);

??????????????????????????? const char *row=(*env)->GetStringUTFChars(env,jrow,0);

?

??????????????????????????? args[i]=malloc(strlen(row)+1);

??????????????????????????? strcpy(args[i],row);

?

??????????????????????????? jni_printf("Main argv[%d]=%s",i,args[i]);? //打印args參數(shù)對(duì)應(yīng)的字符串

?

??????????????????????????? (*env)->ReleaseStringUTFChars(env,jrow,row); //釋放java字符串jrow

?

?????????????????? }

?

?????????????????? //加載com_flying_ndktest1_Natives類

?

?????????????????? jNativesCls=(*env)->FindClass(env,CB_CLASS);

?????????????????? if(jNativesCls==0)

?????????????????? {

??????????????????????????? jni_printf("Unable to find class %s",CB_CLASS);

??????????????????????????? return -1;

?????????????????? }

?????????????????? lib_main(clen,args);

?????????????????? return 0;

?

???????? }

???????? /**

???????? ?* 向java層返回一個(gè)字符串

???????? ?*/

???????? jmethodID mSendStr;

???????? static void jni_send_str(const char *text,int level)

???????? {

?????????????????? JNIEnv *env;

?????????????????? if(!g_VM)

?????????????????? {

??????????????????????????? printf("I_JNI_NOVM:%s\n",text);

??????????????????????????? return ;

?????????????????? }

?????????????????? (*g_VM)->AttachCurrentThread(g_VM,(void **)&env,NULL);

?????????????????? if(!jNativesCls)

?????????????????? {

??????????????????????????? jNativesCls=(*env)->FindClass(env,CB_CLASS);

??????????????????????????? if(jNativesCls==0)

??????????????????????????? {

???????????????????????????????????? printf("Unable to find class %s\n",CB_CLASS);

???????????????????????????????????? return ;

??????????????????????????? }

?????????????????? }

?????????????????? if(!mSendStr)

?????????????????? {

?????????????????? ???????? mSendStr=(*env)->GetStaticMethodID(env,jNativesCls,CB_CLASS_CB,CB_CLASS_MSG_SIG);

?

?????????????????? }

?????????????????? if(mSendStr)

?????????????????? {

?????????????????? ???????? (*env)->CallStaticVoidMethod(env,jNativesCls,mSendStr,(*env)->NewStringUTF(env,text),(jint) level);

?

?????????????????? }else

?????????????????? {

??????????????????????????? printf("Unable to find method :%s,signature :%s \n",CB_CLASS_CB,CB_CLASS_MSG_SIG);

?

?????????????????? }

???????? }

?

???????? void jni_printf(char *format,...)

???????? {

?????????????????? va_list argptr;

?????????????????? static char string[1024];

?????????????????? va_start(argptr,format);

?????????????????? vsprintf(string,format,argptr);

?????????????????? va_end(argptr);

?????????????????? jni_send_str(string,0);

???????? }

?

???????? const int getArrayLen(JNIEnv *env,jobjectArray jarray)

???????? {

?????????????????? return (*env)->GetArrayLength(env,jarray);

???????? }

?

???????? int lib_main(int argc,char **argv)

???????? {

?????????????????? int i;

?????????????????? jni_printf("Enteing LIB MAIN");

?????????????????? for(i=0;i<argc;i++)

?????????????????? {

??????????????????????????? jni_printf("LIB MAIN argv[%d]=%s",i,argv[i]);

?????????????????? }

?????????????????? return 0;

???????? }

至此,完成了java c語言的互掉,最主要的是實(shí)現(xiàn)了原生層日志打印的功能,這個(gè)功能可以為今后開發(fā)提供輕量級(jí)的日志調(diào)試功能!!

?

?

總結(jié)

以上是生活随笔為你收集整理的Android NDK编程小试---实现java和c语言的互掉的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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