Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(java): Add simple JNI demo #32

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions java-jni/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

*.o
*.so
*.class
37 changes: 37 additions & 0 deletions java-jni/DemoJNI.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include <stdio.h>

#include "DemoJNI.h"

int __attribute__((noinline)) nativeTop1() {
for (int i = 0; i < 1000; i++) {
}

return 0;
}

int __attribute__((noinline)) nativeTop2() {

for (int i = 0; i < 1000; i++) {
}

return 0;
}

// ones
int __attribute__((noinline)) nativeC1() { return nativeTop1(); }

int __attribute__((noinline)) nativeB1() { return nativeC1(); }

JNIEXPORT void JNICALL Java_DemoJNI_nativeA1(JNIEnv *, jobject) {

printf("%d", nativeB1());
}

// twos
int __attribute__((noinline)) nativeC2() { return nativeTop2(); }

int __attribute__((noinline)) nativeB2() { return nativeC2(); }

JNIEXPORT void JNICALL Java_DemoJNI_nativeA2(JNIEnv *, jobject) {
printf("%d", nativeB2());
}
29 changes: 29 additions & 0 deletions java-jni/DemoJNI.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 35 additions & 0 deletions java-jni/DemoJNI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
public class DemoJNI {

static {
System.loadLibrary("demo");
}

private native void nativeA1();
private native void nativeA2();

public void A1() {
B1();
}

public void A2() {
B2();
}

public void B1() {
nativeA1();
}

public void B2() {
nativeA2();
}

public static void main(String[] args) {
DemoJNI obj = new DemoJNI();
while (true) {
System.out.println("A1");
obj.A1();
System.out.println("B1");
obj.B1();
}
}
}
76 changes: 76 additions & 0 deletions java-jni/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# TODO(kakkoyun): To do try jlinks
FROM eclipse-temurin:19 as jre-build

RUN $JAVA_HOME/bin/jlink \
--add-modules java.base \
# --strip-debug \
# --no-header-files \
--compress=2 \
--output /javaruntime

# $java --list-modules
# com.greetings
# java.base@9
# java.compiler@9
# java.datatransfer@9
# java.desktop@9
# java.logging@9
# java.management@9
# java.management.rmi@9
# java.naming@9
# java.prefs@9
# java.rmi@9
# java.scripting@9
# java.security.jgss@9
# java.security.sasl@9
# java.smartcardio@9
# java.xml@9
# java.xml.crypto@9
# jdk.accessibility@9
# jdk.charsets@9
# jdk.compiler@9
# jdk.crypto.cryptoki@9
# jdk.crypto.ec@9
# jdk.crypto.mscapi@9
# jdk.deploy@9
# jdk.dynalink@9
# jdk.internal.opt@9
# jdk.jartool@9
# jdk.javadoc@9
# jdk.jdeps@9
# jdk.jlink@9
# jdk.localedata@9
# jdk.management@9
# jdk.naming.dns@9
# jdk.naming.rmi@9
# jdk.scripting.nashorn@9
# jdk.security.auth@9
# jdk.security.jgss@9
# jdk.unsupported@9
# jdk.zipfs@9
# [email protected]

FROM eclipse-temurin:19-jdk as builder

RUN apt-get update && apt-get install -y build-essential

WORKDIR /app

COPY DemoJNI.java DemoJNI.cpp Makefile ./

RUN make compile

# FROM eclipse-temurin:19-jre as runner
FROM debian:buster-slim as runner

ENV JAVA_HOME=/opt/java/openjdk
ENV PATH "${JAVA_HOME}/bin:${PATH}"
COPY --from=jre-build /javaruntime $JAVA_HOME

COPY --from=builder /app/DemoJNI.class .
COPY --from=builder /app/lib/libdemo.so /usr/lib

# "-XX:+UnlockExperimentalVMOptions", "-XX:+UseContainerSupport", "-XX:+PreserveFramePointer",
# "-agentpath:/app/libperfmap.so", "-Djava.security.egd=file:/dev/./urandom",
# --XX:+DebugNonSafepoints
CMD ["java", "-cp", ".", "-Djava.library.path=/usr/lib", "DemoJNI"]
22 changes: 22 additions & 0 deletions java-jni/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
.PHONY: build
build:
docker build -t parca-demo:java-jni .

.PHONY: generate
generate:
javac -h . DemoJNI.java

.PHONY: compile
compile: generate lib/libdemo.so

lib/libdemo.so:
mkdir -p lib
g++ -g -fno-omit-frame-pointer -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux DemoJNI.cpp -shared -o lib/libdemo.so

.PHONY: run
run: compile
java -cp . -Djava.library.path=./lib DemoJNI

.PHONY: clean
clean:
rm -rf lib/*.so DemoJNI.h *.o *.so *.class
24 changes: 24 additions & 0 deletions java-jni/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: demo-java-jni
name: java
namespace: parca
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: demo-java-jni
template:
metadata:
labels:
app.kubernetes.io/name: demo-java-jni
spec:
containers:
- image: parca-demo:java-jni
name: java
resources:
limits:
cpu: '100m'
memory: '256Mi'
Empty file added java-jni/lib/.gitkeep
Empty file.
4 changes: 2 additions & 2 deletions java/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
FROM gradle:7.3.3-jdk11 AS build
COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle build --no-daemon
RUN gradle build --no-daemon

FROM debian

Expand All @@ -14,4 +14,4 @@ RUN apt-get update && apt-get install -y openjdk-11-jre-headless openjdk-11-dbg
COPY --from=build /home/gradle/src/build/libs/demo-0.0.1-SNAPSHOT.jar /app/demo.jar
ADD https://github.com/parca-dev/perf-map-agent/releases/download/v0.0.1/libperfmap.so /app/libperfmap.so

ENTRYPOINT ["java", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseContainerSupport", "-XX:+PreserveFramePointer", "-agentpath:/app/libperfmap.so", "-Djava.security.egd=file:/dev/./urandom","-jar","/app/demo.jar"]
ENTRYPOINT ["java", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseContainerSupport", "-XX:+PreserveFramePointer", "-agentpath:/app/libperfmap.so", "-Djava.security.egd=file:/dev/./urandom", "-jar","/app/demo.jar"]
1 change: 0 additions & 1 deletion java/src/main/java/com/example/demo/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
for (String beanName : beanNames) {
System.out.println(beanName);
}

};
}

Expand Down