คำถามติดแท็ก java-native-interface

Java Native Interface (JNI) ให้ทั้งความสามารถสำหรับการใช้งาน JVM เพื่อรันโค้ดเนทีฟของระบบและความสามารถสำหรับโค้ดเนทีฟในการรันโค้ด Java (โดยการสร้างอินสแตนซ์ JVM ใหม่) ภาษาเป้าหมายที่พบบ่อยที่สุดสำหรับ JNI คือ C และ C ++ ซึ่งอย่างน้อยการใช้งาน Sun / Oracle JDK จะมีคำสั่งตัวช่วย (javap - สำหรับการถอดรหัส, javah สำหรับการสร้างโค้ด c)

30
ไม่สามารถโหลด JNI shared Library (JDK)
เมื่อฉันลองเปิดEclipse จะมีหน้าต่างโต้ตอบปรากฏขึ้น: ไม่สามารถโหลดไลบรารีที่แชร์ JNI "C: /JDK/bin/client/jvm.dll" ` หลังจากนี้ Eclipse Force จะปิดลง นี่คือบางจุดที่ฉันต้องการทำ: ฉันตรวจสอบเพื่อดูว่ามีสิ่งใดอยู่ที่เส้นทางนั้นหรือไม่ มันมีอยู่จริง My Eclipse และJava SE Development Kitนั้นเป็นแบบ 64 บิต ฉันตรวจสอบระบบของฉันและสามารถรองรับ 64- บิตได้ ฉันค้นหาปัญหานี้ใน Google และใน Stack Overflow และคำตอบเดียวที่ฉันพบคือการดาวน์โหลด JDK และ Eclipse รุ่น 32 บิต การดาวน์โหลดเวอร์ชั่น 32 บิตเป็นสิ่งที่ฉันต้องการทำเพื่อเป็นทางเลือกสุดท้าย มีข้อเสนอแนะอะไรในการแก้ไขปัญหานี้?

11
ฉันจะบอกได้อย่างไรว่าฉันใช้ JVM 64- บิตหรือ JVM 32- บิต (จากภายในโปรแกรม)
ฉันจะทราบได้อย่างไรว่า JVM ที่แอปพลิเคชันของฉันทำงานคือ 32 บิตหรือ 64 บิต โดยเฉพาะฟังก์ชั่นหรือคุณสมบัติใดที่ฉันสามารถใช้เพื่อตรวจจับสิ่งนี้ภายในโปรแกรม?


3
อะไรทำให้ JNI โทรช้า?
ฉันรู้ว่า 'การข้ามเขตแดน' เมื่อทำการโทร JNI ใน Java ช้า อย่างไรก็ตามฉันอยากรู้ว่าอะไรทำให้ช้าลง? การนำ jvm ไปปฏิบัติใช้ทำอะไรเมื่อทำการโทร JNI ที่ทำให้ช้ามาก?

4
วิธีการคืนค่าอาร์เรย์จาก JNI ถึง Java?
ฉันพยายามใช้ Android NDK มีวิธีคืนอาร์เรย์ (ในกรณีของฉันint[]) สร้างใน JNI ถึง Java หรือไม่ ถ้าเป็นเช่นนั้นโปรดให้ตัวอย่างรวดเร็วของฟังก์ชั่น JNI ที่จะทำเช่นนี้ ขอบคุณ

2
จะใช้รหัส C ++ เดียวกันสำหรับ Android และ iOS ได้อย่างไร?
Android ที่มีNDKรองรับโค้ด C / C ++ และ iOS ที่มีObjective-C ++ก็รองรับเช่นกันดังนั้นฉันจะเขียนแอปพลิเคชันด้วยโค้ด C / C ++ ที่แชร์ระหว่าง Android และ iOS ได้อย่างไร


2
JNI แปลง jstring เป็น char *
ฉันส่งสตริง URL จากโค้ด Java เป็น C เป็นjstringประเภทข้อมูลผ่านการใช้ JNI และวิธีการไลบรารีของฉันต้องการchar *as url ฉันจะแปลงjstringในchar *? PS: มีข้อดีของการใช้ jcharArray ใน C หรือไม่? (เช่นการส่งผ่านchar []แทนสตริงในวิธีดั้งเดิม)

7
วิธีรวมไลบรารีเนทีฟและไลบรารี JNI ไว้ใน JAR
ห้องสมุดในคำถามคือคณะรัฐมนตรีโตเกียว ฉันต้องการมีไลบรารีเนทีฟไลบรารี JNI และคลาส Java API ทั้งหมดในไฟล์ JAR เดียวเพื่อหลีกเลี่ยงปัญหาการแจกจ่ายซ้ำ ดูเหมือนจะมีความพยายามในเรื่องนี้ที่ GitHubแต่ ไม่รวมไลบรารีเนทีฟจริงเฉพาะไลบรารี JNI ดูเหมือนว่าจะเฉพาะสำหรับปลั๊กอินการพึ่งพาดั้งเดิมของLeiningen (จะไม่ทำงานเป็นแบบแจกจ่ายต่อได้) คำถามคือฉันสามารถรวมทุกอย่างไว้ใน JAR เดียวและแจกจ่ายต่อได้หรือไม่? ถ้าใช่อย่างไร PS: ใช่ฉันรู้ว่ามันอาจมีผลต่อการพกพา

15
การอ้างอิงที่ไม่ได้กำหนดถึง `__android_log_print '
ไฟล์ make ของฉันมีอะไรผิดปกติ Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := foo LOCAL_SRC_FILES := foo.c LOCAL_EXPORT_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY) foo.c #include <string.h> #include <jni.h> #include <android/log.h> #define LOG_TAG "foo" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) void test() { LOGI("test"); } ndk-build foo.c:9: undefined reference to `__android_log_print'

9
วิธีการนำเข้าคลาสจากแพ็คเกจเริ่มต้น
Possible Duplicate: จะเข้าถึง java-class ใน default-package ได้อย่างไร? ฉันใช้ Eclipse 3.5 และฉันได้สร้างโปรเจ็กต์ที่มีโครงสร้างแพ็กเกจพร้อมกับแพ็คเกจเริ่มต้น ฉันมีคลาสหนึ่งในแพ็คเกจเริ่มต้น - Calculations.javaและฉันต้องการใช้คลาสนั้นในแพ็คเกจใดก็ได้ (เช่นในcom.company.calc) เมื่อฉันพยายามใช้คลาสซึ่งอยู่ในแพ็คเกจเริ่มต้นมันทำให้ฉันมีข้อผิดพลาดของคอมไพเลอร์ ไม่สามารถจดจำคลาสในแพ็กเกจเริ่มต้นได้ ปัญหาอยู่ที่ไหน Calculations.java - ซอร์สโค้ด public class Calculations { native public int Calculate(int contextId); native public double GetProgress(int contextId); static { System.loadLibrary("Calc"); } } ฉันไม่สามารถรวมชั้นเรียนไว้ในแพ็คเกจอื่นได้ คลาสนี้มีวิธีดั้งเดิมบางอย่างที่นำมาใช้ในเดลฟี ถ้าฉันใส่คลาสนั้นในโฟลเดอร์ใด ๆ ฉันจะต้องทำการเปลี่ยนแปลงกับ DLL ที่ฉันต้องการหลีกเลี่ยง (จริงๆ - ฉันทำไม่ได้) …

2
การเรียกใช้วิธี java จาก c ++ ใน Android
ฉันพยายามเรียกเมธอด Java ง่ายๆจาก C ++ ในขณะที่ Java เรียกวิธีเนทีฟ นี่คือรหัส Java: public class MainActivity extends Activity { private static String LIB_NAME = "name"; static { System.loadLibrary(LIB_NAME); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView) findViewById(R.id.textview); tv.setText(this.getJniString()); } …

4
ฉันจะตรวจจับ SIGSEGV (ข้อผิดพลาดในการแบ่งส่วน) และรับสแต็กติดตามภายใต้ JNI บน Android ได้อย่างไร
ฉันกำลังย้ายโปรเจ็กต์ไปยัง Android Native Development Kit (เช่น JNI) และฉันต้องการจับ SIGSEGV หากเกิดขึ้น (อาจเป็น SIGILL, SIGABRT, SIGFPE) เพื่อนำเสนอกล่องโต้ตอบการรายงานข้อขัดข้องที่ดีแทน (หรือก่อนหน้า) สิ่งที่เกิดขึ้นในปัจจุบัน: การเสียชีวิตอย่างไม่เป็นโรคในทันทีของกระบวนการและระบบปฏิบัติการอาจพยายามเริ่มต้นใหม่ ( แก้ไข: JVM / Dalvik VM จับสัญญาณและบันทึกการติดตามสแต็กและข้อมูลที่เป็นประโยชน์อื่น ๆ ฉันแค่ต้องการเสนอตัวเลือกให้ผู้ใช้ส่งอีเมลข้อมูลนั้นให้ฉันจริงๆ) สถานการณ์คือโค้ด C ขนาดใหญ่ที่ฉันไม่ได้เขียนทำงานส่วนใหญ่ในแอปพลิเคชันนี้ (ตรรกะของเกมทั้งหมด) และแม้ว่าจะผ่านการทดสอบอย่างดีบนแพลตฟอร์มอื่น ๆ มากมาย แต่ก็เป็นไปได้ทั้งหมดที่ฉันใน Android ของฉัน พอร์ตจะป้อนขยะและทำให้เกิดข้อผิดพลาดในโค้ดเนทีฟดังนั้นฉันต้องการให้การถ่ายโอนความผิดพลาด (ทั้งเนทีฟและ Java) ที่แสดงในบันทึกของ Android (ฉันเดาว่ามันน่าจะเป็น stderr ในสถานการณ์ที่ไม่ใช่ Android) ฉันมีอิสระที่จะแก้ไขทั้งรหัส C และ Java …

14
java.lang.Uns พอใจLinkError no *****. dll ใน java.library.path
ฉันจะโหลดไฟล์ dll แบบกำหนดเองในเว็บแอปพลิเคชันของฉันได้อย่างไร? ฉันได้ลองสิ่งต่อไปนี้: คัดลอก dll ที่จำเป็นทั้งหมดในsystem32โฟลเดอร์และพยายามโหลดหนึ่งในนั้นในตัวServletสร้างSystem.loadLibrary คัดลอก dll ที่จำเป็นลงในtomcat_home/shared/libและtomcat_home/common/lib dll ทั้งหมดนี้อยู่ในWEB-INF/libเว็บแอปพลิเคชัน

17
วิธีแก้ไข Uns SatisfiedLinkError (ไม่พบไลบรารีที่อ้างอิง) ในโครงการ JNI
ฉันกำลังทำงานกับโปรเจ็กต์ Java ที่ใช้ JNI JNI เรียกไลบรารีแบบกำหนดเองที่ฉันเขียนขึ้นเองสมมติว่า mylib.dll และขึ้นอยู่กับไลบรารีของบุคคลที่สาม libsndfile-1.dll เมื่อฉันเรียกใช้โปรแกรมของฉันมันขัดข้องด้วย java.lang.UnsatisfiedLinkError: C:\...path...\mylib.dll: Can't find dependent libraries. ฉันได้ค้นหาไซต์นี้ (และอื่น ๆ ) และฉันได้ลองแก้ไขหลายอย่าง: ฉันวิ่งวอล์คเกอร์แบบพึ่งพา DW ให้คำเตือนสองสามไลบรารีสองไลบรารีที่ libsndfile ต้องการ MPR.DLL และ SHLWAPI.DLL มี "การนำเข้าที่ไม่ได้รับการแก้ไข" - แต่คำถามที่พบบ่อยของ DWกล่าวว่าคำเตือนเหล่านี้สามารถละเว้นได้อย่างปลอดภัย ฉันคงชื่อวิธีการใน MYLIB.dll ตามที่แนะนำที่นี่ ชื่อเมธอดถูกคอมไพเลอร์ยุ่งเหยิง แต่ฉันเพิ่มแฟล็ก linker และตอนนี้ชื่อเมธอด dll ตรงกับชื่อในไฟล์ส่วนหัว jni ของฉันทุกประการ ฉันใส่ DLL เหล่านี้ทั้งหมดไว้ในไดเร็กทอรีเดียวกัน - ไดเร็กทอรีเดียวกับ. …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.