我试图使用graalvm创建一个java代码的共享库(包括头文件和库文件)。
将有一个java方法,其中包含两个字符串类型的参数,我将从Java中调用这些参数。
我的NativeNativeImpl java方法分析与注释CEntryPoint类似于这个
@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代码如下所示:
//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?
谢谢你的回答!
发布于 2021-03-05 03:21:16
您可以使用CTypeConversion (来自import org.graalvm.nativeimage.c.type.CTypeConversion
)将其转换为holder,而holder.get()将返回一个CCharPointer。
final CTypeConversion.CCharPointerHolder holder=CTypeConversion.toCString(result);
return holder.get();
发布于 2022-03-21 21:00:01
您可能需要为JNI env创建一个接口:
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应用程序中,您可以将本机方法声明为:
private static native void analysis(long isolateThread, String dataDomStr);
https://stackoverflow.com/questions/65857256
复制相似问题