首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用entryPoint将Java发布到具有CCharPointer类型的java GraalVM方法?

如何使用entryPoint将Java发布到具有CCharPointer类型的java GraalVM方法?
EN

Stack Overflow用户
提问于 2021-01-23 08:38:56
回答 2查看 186关注 0票数 0

我试图使用graalvm创建一个java代码的共享库(包括头文件和库文件)。

将有一个java方法,其中包含两个字符串类型的参数,我将从Java中调用这些参数。

我的NativeNativeImpl java方法分析与注释CEntryPoint类似于这个

代码语言:javascript
运行
复制
@CEntryPoint(name = "Java_net_luculent_liems_license_apinative_Native_analysis")
public static CCharPointer analysis(Pointer jniEnv, Pointer clazz,
                               @CEntryPoint.IsolateThreadContext long isolateId, CCharPointer dataCharStr) {
    //logic code
}

调用分析的本地java代码如下所示:

代码语言:javascript
运行
复制
//declare native method 
private static native String analysis(long isolateThread, CCharPointer dataDomStr);

public static String analysisDataDom() {
        System.loadLibrary("nativeimpl");
        long isolateThread = createIsolate();
        String helloStr = "Hello from Java";
        //how to convert helloStr to CCharPointer type ???
        return analysis(isolateThread, helloStr);
}

我的问题喜欢评论:如何为本机方法将java字符串值发布到CCharPointer?

谢谢你的回答!

EN

回答 2

Stack Overflow用户

发布于 2021-03-05 03:21:16

您可以使用CTypeConversion (来自import org.graalvm.nativeimage.c.type.CTypeConversion)将其转换为holder,而holder.get()将返回一个CCharPointer。

代码语言:javascript
运行
复制
final CTypeConversion.CCharPointerHolder holder=CTypeConversion.toCString(result);
            return holder.get();
票数 0
EN

Stack Overflow用户

发布于 2022-03-21 21:00:01

您可能需要为JNI env创建一个接口:

代码语言:javascript
运行
复制
import com.oracle.svm.jni.nativeapi.JNIHeaderDirectives;
import org.graalvm.nativeimage.IsolateThread;
import org.graalvm.nativeimage.c.CContext;
import org.graalvm.nativeimage.c.function.CEntryPoint;
import org.graalvm.nativeimage.c.function.CFunctionPointer;
import org.graalvm.nativeimage.c.function.InvokeCFunctionPointer;
import org.graalvm.nativeimage.c.struct.CField;
import org.graalvm.nativeimage.c.struct.CStruct;
import org.graalvm.nativeimage.c.type.CCharPointer;
import org.graalvm.nativeimage.c.type.CTypeConversion;
import org.graalvm.word.Pointer;
import org.graalvm.word.PointerBase;

@CContext(JNIHeaderDirectives.class)
@CStruct(value = "JNIEnv_", addStructKeyword = true)
interface JNIEnv extends PointerBase {

    @CField("functions")
    JNINativeInterface getFunctions();

    @CStruct(value = "JNINativeInterface_", addStructKeyword = true)
    interface JNINativeInterface extends PointerBase {
        @CField
        NewStringUTF getNewStringUTF();

        @CField
        GetStringUTFChars getGetStringUTFChars();
    }

    interface JObject extends PointerBase {
    }

    interface JString extends JObject {
    }

    interface NewStringUTF extends CFunctionPointer {
        @InvokeCFunctionPointer
        JString call(JNIEnv env, CCharPointer cCharPointer);
    }

    interface GetStringUTFChars extends CFunctionPointer {
        @InvokeCFunctionPointer
        CCharPointer call(JNIEnv env, JString str, byte isCopy);
    }
}

public class Analysis {
    @CEntryPoint(name = "Java_net_luculent_liems_license_apinative_Native_analysis")
    public static void analysis(JNIEnv jniEnv, Pointer clazz, @CEntryPoint.IsolateThreadContext long isolateId, JNIEnv.JString dataCharStr) {
        JNIEnv.JNINativeInterface fn = jniEnv.getFunctions();
        CCharPointer charptr = fn.getGetStringUTFChars().call(jniEnv, dataCharStr, (byte) 0);
        final String resultString  =  CTypeConversion.toJavaString(charptr);
        System.out.println(resultString);
    }

    @CEntryPoint(name = "Java_net_luculent_liems_license_apinative_Native_createIsolate", builtin=CEntryPoint.Builtin.CREATE_ISOLATE)
    public static native IsolateThread createIsolate();
}

在Java应用程序中,您可以将本机方法声明为:

代码语言:javascript
运行
复制
    private static native void analysis(long isolateThread, String dataDomStr);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65857256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档