麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

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

2020-01-31 16:50:40
字體:
供稿:網(wǎng)友
廢話不多說,直接上碼.......
復(fù)制代碼 代碼如下:

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的類,第一步當(dāng)然要有一個(gè)Java的類,這個(gè)類是我自行建立
要產(chǎn)生一個(gè)文字的Bitmap,技術(shù)上沒什么復(fù)雜性,建立Paint,建立Bitmap然后用Canvas將文字寫入
在Canvas的drawText中,會(huì)使用FontMetrics的值來寫入文字,所以利用fm.ascent讓文字往上對(duì)齊
復(fù)制代碼 代碼如下:

// 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(shù)_env
復(fù)制代碼 代碼如下:

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;
}

復(fù)制代碼 代碼如下:

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

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



辛苦了這么久,我的CloudBox終于能顯示文字了!!!!!!
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品免费一区二区 | 久久最新网址 | a一级黄色毛片 | 四季久久免费一区二区三区四区 | 欧美无限资源 | 国产精品白嫩白嫩大学美女 | 免费男女乱淫真视频 | 亚洲一区二区三区视频 | 一级做a爰性色毛片免费1 | 88xx成人永久免费观看 | 国产一级做a爰片在线看 | 色淫网站免费视频 | xnxx 日本免费| 久久精品视频16 | 99亚洲伊人久久精品影院红桃 | 性爱免费视频 | 久久精精品 | 九九热视频这里只有精品 | 美女视频黄a视频免费全过程 | 色淫视频 | 欧美中文字幕一区二区三区亚洲 | 九九热免费视频在线观看 | 欧美一级不卡视频 | 亚洲一区二区免费视频 | 二级大黄大片高清在线视频 | 色诱亚洲精品久久久久久 | 久久久久久久久久久国产精品 | 成人视屏在线 | 国产精品片一区二区三区 | 午夜视频在线观看免费视频 | 国产在线一级片 | 我爱我色成人网 | 精品无码一区在线观看 | 777午夜精品视频在线播放 | 日韩一级视频 | 欧美日韩大片在线观看 | 日本不卡一区二区在线观看 | 一级免费看片 | 在线a毛片 | 国产一区二区三区色淫影院 | 国产黄网 |