亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

探討:如何在NDK中呼叫Java的class

2020-01-31 16:50:40
字體:
來源:轉載
供稿:網友
廢話不多說,直接上碼.......
復制代碼 代碼如下:

package com.clouddevelop.cloudbox;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
public class TextManager
{
    public Bitmap create(String text, float size)
    {
        try
        {
            Paint paint = new Paint();
            paint.setColor(Color.WHITE);
            paint.setTextSize(size);
            paint.setAlpha(255);
            paint.setFlags(Paint.ANTI_ALIAS_FLAG);
            paint.setTextAlign(Paint.Align.LEFT);
            paint.setAntiAlias(true);
            float[] widths = new float[text.length()];;
            paint.getTextWidths(text, widths);
            float width = 0;
            for(int i = 0 ;i < widths.length ; i++)
                width += widths[i];
            FontMetrics fm = paint.getFontMetrics();
            int mFontHeight = (int) (Math.ceil(fm.descent - fm.top) + 2);
            Bitmap textImg = Bitmap.createBitmap((int)width, mFontHeight, Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(textImg);
            if(fm.ascent < 0)
                c.drawText(text,0,(float)Math.abs(fm.ascent),paint);
            else
                c.drawText(text,0,fm.ascent* -1,paint);

            return textImg;
        }
        catch (Exception e) { }
        return null;
    }
    public int getWidth(Bitmap bmp) { return bmp.getWidth(); }
    public int getHeight(Bitmap bmp) { return bmp.getHeight(); }
    public void getPixels(Bitmap bmp, int[] pixels)
    {
        int w = bmp.getWidth();
        int h = bmp.getHeight();
        bmp.getPixels(pixels, 0, w, 0, 0, w, h);
    }
    public void close(Bitmap bmp)
    {
        bmp.recycle();
    }
}

要在NDK中呼叫Java的類,第一步當然要有一個Java的類,這個類是我自行建立
要產生一個文字的Bitmap,技術上沒什么復雜性,建立Paint,建立Bitmap然后用Canvas將文字寫入
在Canvas的drawText中,會使用FontMetrics的值來寫入文字,所以利用fm.ascent讓文字往上對齊
復制代碼 代碼如下:

// declare
JNIEXPORT void JNICALL Java_com_clouddevelop_cloudbox_CloudRenderer_nativeTextInit
(JNIEnv* env, jclass cls, jobject textManager);
// implement
JNIEXPORT void JNICALL Java_com_clouddevelop_cloudbox_CloudRenderer_nativeTextInit
(JNIEnv* env, jclass cls, jobject textManager)
{
    g_env = env;
    g_textmgr = textManager;
    jclass business_class = env->GetObjectClass(g_textmgr);
    AndroidLog("initial textmanager success!");
}

接下來要在JNI中將JNIEnv存到全域變量中g_env
復制代碼 代碼如下:

jobject getInstance(JNIEnv* env, jclass obj_class)
{
    jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
    jobject obj = env->NewObject(obj_class, construction_id);
    return obj;
}
GLuint createText(const char* text, float size,float* rWidth, float* rHeight)
{
    if(g_env)
        AndroidLog("g_env exist");
    if(g_textmgr)
        AndroidLog("g_textmgr exist");
    jclass order_class = g_env->FindClass("com/clouddevelop/cloudbox/TextManager");
    AndroidLog("FindClass succeed");
    g_textmgr = getInstance(g_env, order_class);
    jclass cls = g_env->GetObjectClass(g_textmgr);
    AndroidLog("get class succeed");
    jmethodID mid;
    mid = g_env->GetMethodID(cls, "create",
                             "(Ljava/lang/String;F)Landroid/graphics/Bitmap;");
    AndroidLog("get create succeed");
    jstring data = g_env->NewStringUTF(text);
    jobject textImage = g_env->CallObjectMethod(g_textmgr, mid, data,size);
    AndroidLog("call create succeed");
    g_env->DeleteLocalRef(data);
    g_env->NewGlobalRef(textImage);
    /* Get image dimensions */
    mid = g_env->GetMethodID(cls, "getWidth", "(Landroid/graphics/Bitmap;)I");
    int width = g_env->CallIntMethod(g_textmgr, mid, textImage);
    AndroidLog("call getWidth succeed");
    mid = g_env->GetMethodID(cls, "getHeight", "(Landroid/graphics/Bitmap;)I");
    int height = g_env->CallIntMethod(g_textmgr, mid, textImage);
    AndroidLog("call getHeight succeed");
    *rWidth = width;
    *rHeight = height;
    /* Get pixels */
    jintArray image_data = g_env->NewIntArray(width * height);
    g_env->NewGlobalRef(image_data);
    mid = g_env->GetMethodID(cls, "getPixels", "(Landroid/graphics/Bitmap;[I)V");
    g_env->CallVoidMethod(g_textmgr, mid, textImage, image_data);
    AndroidLog("call getPixels succeed");
    jint *pixels = g_env->GetIntArrayElements(image_data, 0);
    //Now generate the OpenGL texture object
    GLuint texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
          GL_UNSIGNED_BYTE, (GLvoid*) pixels);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    AndroidLog("generate texture succeed");
    g_env->ReleaseIntArrayElements(image_data, pixels, 0);
    g_env->DeleteGlobalRef(image_data);
    /* Free image */
    mid = g_env->GetMethodID(cls, "close", "(Landroid/graphics/Bitmap;)V");
    g_env->CallVoidMethod(g_textmgr, mid, textImage);
    AndroidLog("call close succeed");
    g_env->DeleteGlobalRef(textImage);
    return texture;
}

復制代碼 代碼如下:

jobject getInstance(JNIEnv* env, jclass obj_class)
{
    jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
    jobject obj = env->NewObject(obj_class, construction_id);
    return obj;
}

上面這段代碼,是在native code中創建一個Java的實體類
這段代碼是我的CloudBox中創建文字紋理的代碼
mid = g_env->GetMethodID(cls, "getWidth", "(Landroid/graphics/Bitmap;)I");
int width = g_env->CallIntMethod(g_textmgr, mid, textImage);
其中這兩行,GetMethodID先取得該類的方法
在GetMethodID中第一參數是Java 類對象。第二個參數是參數(或方法名),第三個參數是該參數(或方法)的簽名。
那要如何取得方法的簽名呢?
我們要利用Javap -s TextManager這個指令來做

首先到.class所在的文件夾下,在我的范例中是在D:/CloudAndroid/CloudBox/CloudBoxAndroidGameApplication/bin/com/clouddevelop/cloudbox
然后鍵入javap -s TextManager就可以得到了,Signature就是我們要的簽名。



辛苦了這么久,我的CloudBox終于能顯示文字了!?。。。。?BR>
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线视频欧美性高潮| 最近2019年好看中文字幕视频| 亚洲老司机av| 亚洲女同精品视频| 国产精品对白刺激| 亚洲精品中文字| 亚洲色图综合网| 91久久国产婷婷一区二区| x99av成人免费| 亚洲爱爱爱爱爱| 欧美一级视频免费在线观看| 成人网页在线免费观看| 91理论片午午论夜理片久久| 精品福利樱桃av导航| 欧美日韩国产精品专区| 亚洲999一在线观看www| 成人h视频在线| 国产精品a久久久久久| 欧美另类极品videosbest最新版本| 欧美大全免费观看电视剧大泉洋| 国产视频在线观看一区二区| 亚洲一区二区三区乱码aⅴ| 午夜精品久久久99热福利| 欧美日韩性生活视频| 岛国精品视频在线播放| 亚洲国产精品999| 久久视频精品在线| 成人福利免费观看| 欧洲成人性视频| 一区二区三区动漫| 亚洲精品资源在线| 日韩欧美视频一区二区三区| 国产大片精品免费永久看nba| 中文字幕日韩欧美精品在线观看| 欧美亚洲免费电影| 亚洲精品短视频| 国产欧美精品一区二区三区-老狼| 欧美午夜女人视频在线| 日韩精品有码在线观看| 亚洲欧洲在线免费| 91老司机在线| 992tv在线成人免费观看| 久久精品成人动漫| 国产区精品在线观看| 欧美黄色免费网站| 日韩在线观看免费全集电视剧网站| 欧美夫妻性视频| 中文字幕日韩av电影| 日本久久中文字幕| 啊v视频在线一区二区三区| 日韩中文在线中文网三级| 欧美日韩国产精品一区二区三区四区| 亚洲国产精品视频在线观看| 亚洲精品欧美日韩| 琪琪亚洲精品午夜在线| 欧美在线视频在线播放完整版免费观看| 92裸体在线视频网站| 欧美激情欧美狂野欧美精品| 91av福利视频| 欧美精品激情在线| 欧美性生活大片免费观看网址| 伊人伊成久久人综合网站| 精品性高朝久久久久久久| 国产综合久久久久久| 韩剧1988免费观看全集| 欧美日韩国产黄| 中文字幕亚洲欧美一区二区三区| 欧美丰满少妇xxxxx做受| 国产精品99久久久久久人| 欧美成人精品一区| 国产成人jvid在线播放| 久久97久久97精品免视看| 日本在线精品视频| 亚洲美女精品久久| 日韩在线观看视频免费| 国产精品久久9| 午夜精品一区二区三区在线| 日韩欧亚中文在线| 亚洲精品中文字幕有码专区| 久久国产精品网站| 最近2019中文字幕第三页视频| 亚洲欧美国产一本综合首页| 欧美国产日韩中文字幕在线| 亚洲午夜av电影| 国产精品99久久久久久www| 国产欧美一区二区| 午夜精品久久久久久久99热| 亚洲片国产一区一级在线观看| 欧美激情在线观看| 九九精品在线播放| 隔壁老王国产在线精品| 国产精品久久久久国产a级| 91久久国产综合久久91精品网站| 九九精品视频在线观看| 97精品免费视频| 国产亚洲欧美视频| 国产精品美女免费看| 亚洲日韩中文字幕| 97在线免费观看视频| 91九色国产社区在线观看| 91经典在线视频| 国产综合香蕉五月婷在线| 亚洲欧美日韩天堂| 久久久久久久久91| 一区二区三区美女xx视频| 色诱女教师一区二区三区| 日韩免费观看高清| 亚洲精品一区av在线播放| 国产999精品| 中文字幕少妇一区二区三区| 国产一区二区三区欧美| 亚洲综合av影视| 欧美极品美女视频网站在线观看免费| 亚洲欧美日韩区| 亚洲欧美在线x视频| 97视频免费在线看| 国产精品嫩草影院一区二区| 国语自产精品视频在线看抢先版图片| 国产男女猛烈无遮挡91| 国产视频亚洲精品| 欧美午夜性色大片在线观看| 永久免费毛片在线播放不卡| 最新69国产成人精品视频免费| 日韩在线欧美在线国产在线| 欧美日韩高清区| 国产精品视频精品| 丁香五六月婷婷久久激情| 国产精品∨欧美精品v日韩精品| 亚洲第一精品久久忘忧草社区| 久久久久久91| 亚洲视频999| 福利一区福利二区微拍刺激| 亚洲一品av免费观看| 欲色天天网综合久久| 欧美肥婆姓交大片| 国产精品自拍视频| 亚洲一区二区日本| 久久影院模特热| 日韩欧美亚洲国产一区| 国产国语videosex另类| 亚洲日本成人网| 国产亚洲欧美视频| 成人a视频在线观看| 国产成人av在线| 国产福利成人在线| 91亚洲国产精品| 日本欧美精品在线| 91av在线免费观看视频| 成人免费观看49www在线观看| 91亚洲国产成人精品性色| 国产综合视频在线观看| 亚洲精品日韩久久久| 性欧美激情精品| 国产精品综合久久久| 国产成人鲁鲁免费视频a| 亚洲色图综合网| 青青久久av北条麻妃黑人| 国产97在线播放| 4p变态网欧美系列| 欧美久久精品一级黑人c片| 日韩av电影免费观看高清| 青青草一区二区| 欧美精品18videos性欧| 日韩大片在线观看视频|